Skip to content

Commit 2aea72e

Browse files
committed
✨ feat: 添加策略模式
1 parent e2a82e0 commit 2aea72e

File tree

2 files changed

+102
-0
lines changed

2 files changed

+102
-0
lines changed

Strategy/Strategy.js

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// 等级与成绩的映射关系
2+
const levels = {
3+
S : 100,
4+
A : 90,
5+
B : 80,
6+
C : 70,
7+
D : 60
8+
}
9+
10+
// 一组策略
11+
let gradeBaseOnLevel = {
12+
S: () => {
13+
return `当前成绩为${levels['S']}`
14+
},
15+
A: () => {
16+
return `当前成绩为${levels['A']}`
17+
},
18+
B: () => {
19+
return `当前成绩为${levels['B']}`
20+
},
21+
C: () => {
22+
return `当前成绩为${levels['C']}`
23+
},
24+
D: () => {
25+
return `当前成绩为${levels['D']}`
26+
},
27+
}
28+
29+
// 调用方法
30+
function getStudentScore(level) {
31+
return levels[level] ? gradeBaseOnLevel[level]() : 0;
32+
}
33+
34+
console.log(getStudentScore('S')); // 当前成绩为100
35+
console.log(getStudentScore('A')); // 当前成绩为90
36+
console.log(getStudentScore('B')); // 当前成绩为80
37+
console.log(getStudentScore('C')); // 当前成绩为70
38+
console.log(getStudentScore('D')); // 当前成绩为60

Strategy/Strategy.md

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# 策略模式
2+
3+
> 策略模式就是定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。
4+
5+
策略模式的核心是讲算法的使用与算法的实现分离开。
6+
7+
一个策略模式的程序至少要包含两部分:
8+
9+
- 一组策略类,策略类封装了具体的算法,并且负责具体的计算过程
10+
- 环境类,接收客户的请求,随后把请求委托给某一个策略类。要做到这点,说明环境类中要维持对某个策略对象的引用。
11+
12+
13+
14+
### 实现一个策略模式
15+
16+
假设我们要实现一个根据评分来打分的系统
17+
18+
```
19+
// 等级与成绩的映射关系
20+
const levels = {
21+
S : 100,
22+
A : 90,
23+
B : 80,
24+
C : 70,
25+
D : 60
26+
}
27+
28+
// 一组策略
29+
let gradeBaseOnLevel = {
30+
S: () => {
31+
return `当前成绩为${levels['S']}`
32+
},
33+
A: () => {
34+
return `当前成绩为${levels['A']}`
35+
},
36+
B: () => {
37+
return `当前成绩为${levels['B']}`
38+
},
39+
C: () => {
40+
return `当前成绩为${levels['C']}`
41+
},
42+
D: () => {
43+
return `当前成绩为${levels['D']}`
44+
},
45+
}
46+
47+
// 调用方法
48+
function getStudentScore(level) {
49+
return levels[level] ? gradeBaseOnLevel[level]() : 0;
50+
}
51+
52+
console.log(getStudentScore('S')); // 当前成绩为100
53+
console.log(getStudentScore('A')); // 当前成绩为90
54+
console.log(getStudentScore('B')); // 当前成绩为80
55+
console.log(getStudentScore('C')); // 当前成绩为70
56+
console.log(getStudentScore('D')); // 当前成绩为60
57+
```
58+
59+
60+
61+
### 优缺点
62+
63+
- 优点: 可以有效地避免多重条件语句,将一系列方法封装起来也更直观,利于维护
64+
- 缺点: 往往策略组会比较多,我们需要事先知道所有定义好的情况

0 commit comments

Comments
 (0)