策略模式:定义一系列的算法(业务规则),把它们一个个封装起来,并且使它们可以相互替换。将算法的使用与实现分离
一个基于策略模式的程序至少有两个部分组成:
- 策略类:封装具体的算法,并负责具体的计算过程 (实现)
- 环境类:接受客户的请求,随后将请求委托给某一个策略类(使用)
举个例子:发奖金方法,奖金发放根据薪资和绩效级别决定,在未使用策略模式时,方法如下:
function getBonus(salary, level) {
if (level === 'A') {
return salary * 3
} else if (level === 'B') {
return salary * 2
} else if (level === 'C') {
return salary;
} else if (salary === 'D') {
return salary * 0.5
}
}
上面这个方法有过多的if-else判断,而且如果绩效级别有调整,需要深入这个方法的内部实现进行调整,违反开放-封闭原则。
对于奖金发放来说可以将由各个绩效级别对应的计算方法封装成一个对象,然后调取对应方法,可以写成如下代码:
const strategy = {
A(salary) {
return salary * 3;
},
B(salary) {
return salary * 2;
},
C(salary) {
return salary * 1;
},
D(salary) {
return salary * 0.5
}
}
function getBonus(salary, level) {
return strategy[level](salary)
}