策略模式
定义:定义一系列的算法,将他们一个个封装起来,使他们直接可以相互替换。
JavaScript版策略模式实现
const strategy = {
"S": function (salary) {
return salary * 4;
},
"A": function (salary) {
return salary * 3;
},
"B": function (salary) {
return salary * 2;
}
}
let calculateBonus = function (level, salary) {
return strategy[level](salary);
}
console.log(calculateBonus('A', 20000))
利用策略模式解决的一些应用场景
我们在做一些管理后台系统时,很多时候需要用到各种表单验证的问题。
而各种验证规则可以写入一个策略类中。
const strategies = {
isNonEmpty(value, errorMsg) { // 判断是否为空
if (value === '') {
return errorMsg;
}
},
minLength(value, length, errorMsg) { //欧安的最小长度
if (value.length < length) {
return errorMsg;
}
}
}
console.log(strategies.isNonEmpty('','用户信息不可为空'));
策略模式的优点:
- 策略模式利用组合、委托和多态等技术和思想,可以有效的避免多重条件选择语句。
- 策略模式提供了对开放-封闭原则的完美支持,将算法封装在独立的 strategy 中,使得它们易于切换,易于理解,易于扩展。
- 策略模式中的算法也可以复用在系统的其他地方,从而避免许多重复的复制粘贴工作。
- 在策略模式中利用组合和委托来让 Context拥有执行算法的能力,这也是继承的一种更轻便的替代方案。
策略模式的缺点,但不严重:
- 使用策略模式会在程序中增加许多策略类或者策略对象,但实际上这比把它们负责的逻辑堆砌在 Context 中好。
- 想要使用策略模式,必须了解所有的 strategy,必须了解各个 strategy 之间的不同点,这样才能选择一个合适的
strategy。此时 strategy 要向客户暴露它的所有实现,这是违反最少知识原则的。