1. 策略模式的简单理解
定义:多种途径达到同一个目的地
案例:
1. 如果没有时间但是不在乎钱,可以选择坐飞机
2. 如果没有钱,可以选择坐大巴或者火车
3. 如果再穷一点,可以选择骑自行车
实现:定义一系列的算法,把他们封装起来,并且使他们可以相互替换
2. 案例
2.1 使用 if else
来实现
const calculateBouns = function(perfomancelevel, salary) {
if (perfomancelevel === 'S') {
return salary * 4
}
if (perfomancelevel === 'A') {
return salary * 3
}
if (perfomancelevel === 'B') {
return salary * 2
}
}
calculateBouns('S', 10000)
以上计算方法存在的缺点:
- 函数比较庞大,包含了很多if-else语句,这些语句需要覆盖所有的逻辑分支
- 函数缺乏弹性,如果增加一种新的绩效等级C,或者想把绩效S的奖金系数改为5,那我们必须深入函数的内部实现,这是违反开放 - 封闭的原则的
- 法的复用性查,如果在程序的其他地方需要重用这些计算的方法,只能进行复制粘贴
2.2 使用策略模式实现
一个基于策略模式的程序至少由两部分组成
- 策略类:策略类封装了具体的算法,并负责计算过程
- 环境类Context, Context接收客户端的请求,随后把请求委托给某一个策略类。
要做到这点,说明Context中要维持对某个策略对象的引用
详细一点:定义一系列的算法,把它们各自封装成策略类,算法被封装在策略类内部的方法里面。在客户对Context发起请求的时候,Context总是吧请求委托给这些策略对象中间的某一个进行计算
const strategy = {
'S': function(salary) {
return salary * 4
},
'A': function(salary) {
return salary * 3
},
'B': function(salary) {
return salary * 2
}
}
const getBouns = function(level, salary) {
return strategy[level](salary)
}
console.log(getBouns('S', 1000))
3. 策略模式的优缺点
3.1 优点:
- 策略模式利用组合,委托和多态等技术和思想,可以有效地避免多重条件选择语句
- 策略模式提供了对开放-封闭原则的完美支持,将算法封装在独立的strategy中,使得他们易于切换,易于理解,易于扩展
- 策略模式中的算法也可以复用在系统的其他地方,从而避免许多重复的复制粘贴工作
- 在策略模式中利用组合和委托来让context拥有执行算法的能力,这也是继承的一种更轻便的替代方案
3.2 缺点:
- 使用策略模式会在程序中增加许多策略类或者策略对象,但实际上这比把他们负责的逻辑堆砌在Context中要好
- 要是要策略模式,必须了解所有的strategy,必须了解各个strategy之间的不同点,这样才能选择一个合适的strategy。比如,我们要选择一个合适的旅游出行路线,必须先了解选择飞机,火车,自行车等方案的细节。此时strategy要向客户暴露他的所有实现,这是违反最少知识原则的