代码改变世界

策略者模式

2017-07-24 17:42  grows  阅读(177)  评论(0编辑  收藏  举报

场景:

你想买一盏台灯,现在有很多类型的台灯,分别为:红色的 绿色的,大的 小的等等。你可以选择其中的某一种。

 

现在出现了新的产品智能调节的台灯,那么我们应该怎么办呢?

把台灯能够调节的行为加到父类中?显然这是不合适的,因为这样会让别的灯也具有调节功能。那么现在我们可以使用接口添加调节功能,让有些灯能够进行调节而其他的却不能

 

现在又出现了各种方式的调节功能,我们可以实现调节的接口,那么我们怎样去动态选择不同方式的调节呢?可以通过调用接口来调用不同的调节方法

 

现在看来每个具体的灯如果具有调节功能都必须要实现调节接口,这样会造成再出现新的可以调节的灯时就要实现调节接口,随着灯的类型越来越多,这样将成为一个噩梦。

那么我们怎样去改正呢?好的设计就是把抽象的阶层设计好,当出现新的东西的时候,不改变原有的代码,而是增加新的东西(开闭原则)。

把AdjustInter放在Lamp抽象类中,去用AdjustInter提供的方法,同时可以随意选择调节的方式

 

由于Lamp与AdjustInter之间是关联关系,所以应该在Lamp抽象类中采用声明属性的方式,来放在抽象类Lamp中,声明adjust()方法使用调节功能,同时使用setAdjustInter(AdjustInter adjustInter)来选择不同的调节方式。

通过上面我们就可以知道,调节接口拥有一系列的调节方式,能够提供给使用者即Lamp使用,同时也能够随时选择替换不同的调节方式。这就是策略者模式,即:通过提供一个拥有一系列策略的接口,使 使用者能够使用并且可以随时进行策略的选择替换。

 

这里我们看到每次我们需要更改调节方式都是通过setAdjustInter(AdjustInter adjustInter),这就要求我们知道所有的策略。这也是策略者模式的缺点使用者必须知道所有的策略

优点就是:动态改变策略