# 策略模式
策略模式指的是定义一系列的算法,把它们一个个封装起来,将算法的使用与算法的实现分离开来。
将不变的部分和变化的部分隔开是每个设计模式的主题,策略模式也不例外
根据员工等级计算薪资
cosnt calculatebonus = (level, salary) =>{
if (level === 'S') {
return salary * 0.2;
}
if (level === 'A') {
return salary * 0.1;
}
if (level === 'B') {
return salary * 0;
}
if (level === 'C') {
return salary * -0.1;
}
};
calculatebonus('S', 20000); // 输出:4000
calculatebonus('A', 6000); // 输出:600
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
假如现在需要新增 10个等级?如何处理?
# 使用策略模式解决以上问题
一个基于策略模式的程序至少由两部分组成。
- 第一个部分是一组策略类,策略类封装了具体的算法,并负责具体的计算过程。
- 第二个部分是环境类,环境类接受客户的请求,随后把请求委托给某一个策略类。要做到这点,说明环境类中要维持对某个策略对象的引用。
策略类
class LevelS {
calculate(salary) {
return salary * 0.2;
}
}
class levelA {
calculate(salary) {
return salary * 0.1;
}
}
class levelB {
calculate(salary) {
return salary * 0;
}
}
class levelC {
calculate(salary) {
return salary * -0.1;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
环境类
class Bonus {
constructor(...arguments) {
this.salary = null;//工资
this.strategy = null;//计算绩效工资的策略对象
}
setSalary(salary) {
this.salary = salary; // 设置工资
}
setStrategy(strategy) {
this.strategy = strategy; // 设置计算绩效工资的策略对象
}
getBonus(){
return this.strategy.calculate(this.salary);//计算绩效工资
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
使用
const bonus = new Bonus();
bonus.setSalary( 20000 );//设置工资
bonus.setStrategy( new LevelS() ); // 设置策略对象
console.log( bonus.getBonus() ); // 输出:4000
bonus.setSalary( 6000 );//设置工资
bonus.setStrategy( new LevelA() ); // 设置策略对象
console.log( bonus.getBonus() ); // 输出:600
1
2
3
4
5
6
7
2
3
4
5
6
7