-
Notifications
You must be signed in to change notification settings - Fork 0
/
status.js
156 lines (151 loc) · 3.17 KB
/
status.js
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/*
STEP 1
最简单粗暴的if-else
*/
/*
// 咖啡机类
class CoffeeMaker {
constructor() {
// ... 省略与咖啡状态切换无关的初始化逻辑
// 初始化状态,没有切换任何咖啡模式
this.state = 'init';
}
// 咖啡机状态切换函数
changeState(state) {
this.state = state;
if(state === 'american') {
// 用 console 代指咖啡制作流程的业务逻辑
console.log('只吐黑咖啡');
} else if(state === 'latte') {
console.log('黑咖啡加奶');
} else if(state === 'vanillaLatte') {
console.log('黑咖啡加奶加香草糖浆');
} else if(state === 'mocha') {
console.log('黑咖啡加奶加巧克力');
}
}
}
*/
/*
STEP2 职责分离
*/
/*
class CoffeeMaker {
constructor() {
// ... 省略与咖啡状态切换无关的初始化逻辑
// 初始化状态,没有切换任何咖啡模式
this.state = 'init';
}
// 咖啡机状态切换函数
changeState(state) {
this.state = state;
if(state === 'american') {
// 用 console 代指咖啡制作流程的业务逻辑
this.americanProcess();
} else if(state === 'latte') {
this.latteProcess();
} else if(state === 'vanillaLatte') {
this.vanillaLatteProcess();
} else if(state === 'mocha') {
this.mochaProcess();
}
}
americanProcess() {
console.log('只吐黑咖啡');
}
latteProcess() {
this.americanProcess();
console.log('加奶');
}
vanillaLatteProcess() {
this.latteProcess();
console.log('加香草糖浆');
}
mochaProcess() {
this.latteProcess();
console.log('加巧克力');
}
}
*/
/*
STEP3 开放封闭
*/
/*
const stateToProcessor = {
american() {
console.log('只吐黑咖啡');
},
latte() {
this.american();
console.log('加奶');
},
vanillaLatte() {
this.latte();
console.log('加香草糖浆');
},
mocha() {
this.latte();
console.log('加巧克力');
}
};
class CoffeeMaker {
constructor() {
// ... 省略与咖啡状态切换无关的初始化逻辑
// 初始化状态,没有切换任何咖啡模式
this.state = 'init';
}
// 咖啡机状态切换函数
changeState(state) {
this.state = state;
// 若状态不存在,则返回
if(!stateToProcessor[state]) {
return;
}
stateToProcessor[state]();
}
}
*/
/*
STEP 4
再次改造:将状态处理函数与咖啡机主体关联
*/
// node执行报错,浏览器console可执行
class CoffeeMaker {
constructor() {
// ... 省略与咖啡状态切换无关的初始化逻辑
// 初始化状态,没有切换任何咖啡模式
this.state = 'init';
// 初始化牛奶的存储量
this.leftMilk = '500ml';
}
stateToProcessor = {
that: this,
american() {
console.log('咖啡机现在的牛奶存储量是:', this.that.leftMilk);
console.log('只吐黑咖啡');
},
latte() {
this.american();
console.log('加奶');
},
vanillaLatte() {
this.latte();
console.log('加香草糖浆');
},
mocha() {
this.latte();
console.log('加巧克力');
}
}
// 咖啡机状态切换函数
changeState(state) {
this.state = state;
// 若状态不存在,则返回
if(!this.stateToProcessor[state]) {
return;
}
this.stateToProcessor[state]();
}
}
const mk = new CoffeeMaker();
mk.changeState('latte');