设计模式-javascript实现【策略模式】
定义: 定义一系列的算法,把它们一个个封装起来,并且使他们可以相互替换。
实现方案一:将算法集中在对象中进行管理,利用对象的key值选取需要的算法
// 定义策略对象的一系列算法
const strategies = {
"S": salary => salary * 4,
"A": salary => salary * 3,
"B": salary => salary * 2,
};
// 根据level委托策略对象的具体算法执行计算逻辑
const calculateBonus = (level, salary) => {
return strategies[level](salary);
};
console.log(calculateBonus('S', 2000)); // 8000
console.log(calculateBonus('A', 1000)); // 3000
实现方案二:将选中的算法作为参数传入执行函数
const S = salary => salary * 4;
const A = salary => salary * 3;
const B = salary => salary * 2;
const calculateBonus = (func, salary) => func(salary);
console.log(calculateBonus(S, 1000)); // 4000
策略模式的优点:
- 策略模式利用组合,委托和多态等技术思想,可以有效地避免多重条件选择语句。
- 策略模式提供了对开发-封闭原则的完美支持,将算法封装在独立的strategy中,使得它们易于切换,易于理解
,易于扩展。 - 策略模式的算法也可以复用在系统的其他地方,从而避免许多重复的复制粘贴工作。
- 在策略模式中利用组合和委托来让Context拥有执行算法的能力,这也是继承的一种更轻便的替代方案。