Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 2aea72e

Browse files
✨ 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)

AltStyle によって変換されたページ (->オリジナル) /