2、策略模式

核心:定义一系列算法,并将每个算法封装在具有共同接口的单独对象中,并可替换。
场景:处理一系统相同但有细微差别的逻辑

代码实现:根据绩效计算奖金
未使用策略模式:代码写死了

1
2
3
4
5
6
7
8
9
10
11
12
function getMoney(jixiao, baseMoney) {
if(jixiao === 's') return baseMoney * 2
else if(jixiao === 'a') return baseMoney * 1.5
else if(jixiao === 'b') return baseMoney * 1
else if(jixiao === 'c') return baseMoney * 0.8
else if(jixiao === 'd') return baseMoney * 0.5
else return baseMoney * 0
}

getMoney('s', 1000) // 2000
getMoney('a', 1000) // 1500
getMoney('c', 1000) // 800

使用了策略模式:策略可随时替换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// 奖金策略 1
const moneyStrategie1 = {
s(baseMoney) {
return baseMoney * 2
},
a(baseMoney) {
return baseMoney * 1.5
},
b(baseMoney) {
return baseMoney * 0.8
},
c(baseMoney) {
return baseMoney * 0.5
},
d(baseMoney) {
return baseMoney * 0
}
}

// 奖金策略 2
const moneyStrategie2 = {
s(baseMoney) {
return baseMoney * 20
},
a(baseMoney) {
return baseMoney * 15
},
b(baseMoney) {
return baseMoney * 8
},
c(baseMoney) {
return baseMoney * 5
},
d(baseMoney) {
return baseMoney * 0
}
}

function getMoney(strategy) {
this.calcMoney = (jixiao, baseMoney) => {
return strategy[jixiao](baseMoney)
}
}

// 使用奖金策略 1
const getMoney1 = new getMoney(moneyStrategie1)

getMoney1('s', 1000) // 2000
getMoney1('a', 1000) // 1500
getMoney1('c', 1000) // 800

// 使用奖金策略 2
const getMoney2 = new getMoney(moneyStrategie2)

getMoney1('s', 1000) // 20000
getMoney1('a', 1000) // 15000
getMoney1('c', 1000) // 8000

总结:就是将零散的判断逻辑,封装在单独的对象中,并提供一个策略切换函数。


2、策略模式
https://mrhzq.github.io/职业上一二事/前端面试/JS 设计模式/2、策略模式/
作者
黄智强
发布于
2024年2月13日
许可协议