策略模式:
将一些相同的逻辑状态抽离并封装起来,这些逻辑之间的关系是平等的,可替换的。
什么是策略?
比如:去某个地方旅游,你可以乘火车,可以乘飞机,也可以乘游轮,那么这些交通工具的选择之间就是某种策略,可以看出这些策略之间是可以相互替换的。
和状态模式的区别?
状态模式中每个状态之间其实不是平等的,可替换的,而是相互之间有着联系。
举例:
比如商家为了促销,设置了抽奖,比如抽了一等奖兑换一个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(); p.setLevel(new SecondPrize()); p.getPrize();
|
可以看出,当奖品项增多的时候,只需添加对应的奖品项的类,而无需在主类Prize中添加过多的if,else语句。对各自的逻辑进行了封装,同时符合代码的封闭开放原则。