策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使他们可以相互替换。
很多公司的年终奖都是与绩效有关的,假如绩效S的4倍工资,A的3倍,B的两倍,写一个函数计算员工的年终奖,最初我们的设计可能是这样的:
var calculateBonus = function (level, salary) {
if (level === 'S') {
return salary * 4;
}
if (level === 'A') {
return salary * 3;
}
if (level === 'B') {
return salary * 2;
}
};
calculateBonus('B', 2000) // 输出4000
这段代码中有大量的if…else…语句,我们使用策略模式重构这段代码:
var strategies = {
"S": function (salary) {
return salary * 4;
},
"A": function (salary) {
return salary * 3;
},
"B": function (salary) {
return salary * 2;
},
};
var calculateBonus = function (level, salary) {
return strategies[level](salary)
};
console.log(calculateBonus('S', 2000)); //输出:8000
console.log(calculateBonus('A', 1000)); //输出:3000
重构后的代码,我们把各种策略的算法分离开来,在计算的时候可以通过传入不同的参数选取不同的策略,这样以后也可以新增其它策略,调用的时候也很方便。
策略模式的优缺点
优点:
a.策略模式利用组合、委托和多态等技术和思想,可以有效地避免多重条件判断语句。
b.策略模式提供了对开放-封闭原则的完美支持,将算法封装在独立的strategy中,使得它们易于切换,易于理解,易于扩展。
c.策略模式中的算法也可以复用在系统的其他地方,从而避免许多重复的复制黏贴工作。
d.在策略模式中利用组合和委托来让Context拥有执行算法的能力,这也是继承的一种更轻便的替代方案。
缺点:
会增加策略对象;
要了解所有策略的不同,违反最少知识原则。