File tree Expand file tree Collapse file tree 2 files changed +102
-0
lines changed Expand file tree Collapse file tree 2 files changed +102
-0
lines changed Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
+ - 缺点: 往往策略组会比较多,我们需要事先知道所有定义好的情况
You can’t perform that action at this time.
0 commit comments