JavaScript策略模式

策略模式:

将一些相同的逻辑状态抽离并封装起来,这些逻辑之间的关系是平等的,可替换的。

什么是策略?

比如:去某个地方旅游,你可以乘火车,可以乘飞机,也可以乘游轮,那么这些交通工具的选择之间就是某种策略,可以看出这些策略之间是可以相互替换的。

和状态模式的区别?

状态模式中每个状态之间其实不是平等的,可替换的,而是相互之间有着联系。

举例:
比如商家为了促销,设置了抽奖,比如抽了一等奖兑换一个iPhone,二等奖兑换吸尘器,三等奖兑换小型烤箱,四等奖兑换电吹风,五等奖兑换毛巾一条。

如果我们一般正常写这段程序的话,会有很多if,else语句,就像下面这样:

1
2
3
4
5
6
7
8
9
10
11
if(prize === 'first') {
console.log('iphone');
}else if(prize === 'second') {
console.log('cleaner');
}else if(prize === 'third') {
console.log('oven');
}else if(prize === 'fourth') {
console.log('hair drier');
}else if(prize ==='fifth') {
console.log('towel');
}

如果采用策略模式,代码如下:

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
class FirstPrize {
getPrize(){
console.log('iphone');
}
}
class SecondPrize {
getPrize(){
console.log('cleaner');
}
}
class ThirdPrize {
getPrize(){
console.log('oven');
}
}
class FourthPrize {
getPrize(){
console.log('hair drier');
}
}
class FifthPrize {
getPrize(){
console.log('towel');
}
}

class Prize {
constructor(){
this.level = null;
}
setLevel(level){
this.level = level;
}
getPrize(){
this.level.getPrize();
}
}

var p = new Prize();
p.setLevel(new FirstPrize());
p.getPrize(); // 输出`iphone`
p.setLevel(new SecondPrize());
p.getPrize(); //输出`cleaner`

可以看出,当奖品项增多的时候,只需添加对应的奖品项的类,而无需在主类Prize中添加过多的if,else语句。对各自的逻辑进行了封装,同时符合代码的封闭开放原则。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!