以下是一个计算奖金的函数,该函数需要接受两个参数,员工的工资数额和绩效等级。
var calcBonus = function (performanceLevel, salary) {
if (performanceLevel === "S") {
return salary * 4;
}
if (performanceLevel === "A") {
return salary * 3;
}
if (performanceLevel === "B") {
return salary * 2;
}
};
在这个方法中问题:
1.包含很多if-else语句
2.缺乏弹性,如果增加一中新的绩效等级C,或者想修改S等级的系数,那么我们就需要修改该函数的内部实现。
3.算法复用性差。
我们可以使用策略模式来重构代码。
定义
策略模式指的是定义一系列算法,把它们一个个封装起来。讲不变的部分和变化的部分分隔开是每个设计模式的主题,策略模式也是如此,策略模式的目的就是将算法的使用与算法的实现分离开来。
策略模式设计
一个基于策略模式的程序至少由两部分组成。第一个部分是一组策略类,封装具体的算法,并负责具体的计算过程。第二个部分是环境类Context,Context接受客户请求,随后把请求委托给某一个策略类。
使用策略模式改造上述代码:
var strategies = {
S: function (salary) {
return salary * 4;
},
A: function (salary) {
return salary * 3;
},
B: function (salary) {
return salary * 2;
},
};
var calcBonus = function (performanceLevel, salary) {
return strategies[performanceLevel](salary);
};
console.log(calcBonus("S", 1000));
策略模式的优点
1.策略模式利用组合、委托和多态等技术和思想,可以有效避免多重条件选择语句。
2.策略模式提供了对开放-封闭原则的完美支持,将算法封装在独立的strategy中,使得他们易于切换,易于理解,易于扩展。
3.策略模式中的算法也可以复用在系统的其他地方。
4.策略模式利用组合和委托让Context拥有执行算法的能力,这也是继承的一种更轻便的替代方案。