策略模式:定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换
举个栗子
假设我们要实现一个计算个人奖金数额的函数:
var calcBonus = function (level, salary) {
if (level === 'A') {
return salary * 4;
}
if (level === 'B') {
return salary * 3;
}
if (level === 'C') {
return salary * 2;
}
}
console.log(calcBonus('A', 1000)); // 输出 4000
console.log(calcBonus('B', 1000)); // 输出 4000
这段代码的缺点显然易见:
- 函数体庞大,包含大量的if-else
- 缺乏弹性,如果想增加一种’D’等级,或者把绩效A的奖金系数变成5将会非常麻烦,要深入函数内部改变函数体。
- 代码复用性差,如果想在程序的其他部分想用这些计算奖金的算法我们就只有复制粘贴啦。
使用策略模式重构代码
var strategies = {
'A': function (salary) {
return salary * 4;
},
'B': function () {
return salary * 3;
},
'C': function () {
return salary * 2;
}
}
var calcBonus = function (leve, salary) {
return strategies[level](salary);
}
console.log(calcBonus('A', 2000)); //输出 8000
策略模式优缺点
优点:
- 利用组合,委托和多态等技术和思想,可以有效避免多重条件语句
- 提供了对开闭原则的支持,将算法独立封装在strategies里面。
- 模式中的算法可以复用在多个地方。
缺点:
- 增加了大量的策略对象
- 要是用策略模式就要了解所有策略的实现
- 暴漏了算法