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));
原文地址:https://www.cnblogs.com/stinchan/p/6970628.html