• JavaScript设计模式_02_策略模式


    在程序设计中,我们常常遇到这种情况,要实现某一个功能我们有很多种算法可以实现。
    这些算法灵活多样,而且可以随意互相替换。这种解决方案就是所谓的策略模式。

    /*
     * pre:策略模式
     * 示例:公司计算奖金,分A、B、C 三种绩效,计算方式如下
     * 绩效为A,奖金乘以系数5
     * 绩效为B,奖金乘以系数4
     * 绩效为C,奖金乘以系数3
     */
    //-------- 示例1 ----------
    var calculateBonus = function(performanceLevel, salary) {
        if(performanceLevel === 'A') {
            return salary * 5;
        }
        if(performanceLevel === 'B') {
            return salary * 4;
        }
        if(performanceLevel === 'C') {
            return salary * 3;
        }
    };
    console.log(calculateBonus('A', 2000));
    /*
       缺点:1、函数体系庞大,拥有太多的if-else语句;
          2、如果增加绩效D,需修改内部函数,违背封闭-开放原则;
          3、复用性差,其他地方如果用到计算奖金,只能复制粘贴;
     */
    //--------- 示例2 ------------
    var performanceA = function(salary) {
        return salary * 5;
    };
    var performanceB = function(salary) {
        return salary * 4;
    };
    var performanceC = function(salary) {
        return salary * 3;
    };
    var calculateBonus = function(performanceLevel, salary) {
        if(performanceLevel === 'A') {
            return performanceA(salary);
        }
        if(performanceLevel === 'B') {
            return performanceB(salary);
        }
        if(performanceLevel === 'C') {
            return performanceC(salary);
        }
    };
    console.log(calculateBonus('A', 2000)); 
    /*
      缺点:1、函数体系庞大,系统变化时缺乏弹性
     */
    //--------- 示例3 ------------
    // 策略模式重构:定义一系列算法,将它们一个个封装起来。
    var performanceA = function(){};
    performanceA.prototype.caculate = function(salary){
        return salary * 5;
    };
    var performanceB = function(){};
    performanceB.prototype.caculate = function(salary){
        return salary * 4;
    };
    var performanceC = function(){};
    performanceC.prototype.caculate = function(salary){
        return salary * 3;
    };
    
    var Bonus = function(){
        this.salary = null;
        this.strategy = null;
    };
    Bonus.prototype.setSalary = function(salary){
        this.salary = salary;
    };
    Bonus.prototype.setStrategy = function(strategy){
        this.strategy = strategy;
    }
    Bonus.prototype.getBonus = function(){
        return this.strategy.caculate(this.salary);
    }
    
    var bonus = new Bonus();
    bonus.setSalary(2000);
    bonus.setStrategy(new performanceA());
    console.log(bonus.getBonus());
    
    // ----------- 示例4 ---------------
    // javaScript版本
    var Strategies = {
        "A":function(salary){
            return salary * 5;
        },
        "B":function(salary){
            return salary * 4;
        },
        "C":function(salary){
            return salary * 3;
        }    
    };
    var caculateBonus = function(level,salary){
        return Strategies[level](salary);
    };
    console.log(caculateBonus("A",2000));
  • 相关阅读:
    27. 移除元素
    LeetCode---9.回文数
    PAT 1098 Insertion or Heap Sort (25)
    PAT 1146 Topological Order
    PAT 1147 Heaps(30 分)
    数据结构 二分查找1
    数据结构 树
    PAT 1126 Eulerian Path
    PAT 1111 Online Map (30)
    PAT 1072 Gas Station (30)
  • 原文地址:https://www.cnblogs.com/stinchan/p/6970628.html
Copyright © 2020-2023  润新知