策略模式:定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。
我下面就自己画类图说明自己心里理解的策略模式。
![](file:///C:UsersAdministratorAppDataRoamingTencentUsers734425061QQWinTempRichOle1KK9GCUGMU(I_CEWQQ@CX~F.png)
![](file:///C:UsersAdministratorAppDataRoamingTencentUsers734425061QQWinTempRichOle1KK9GCUGMU(I_CEWQQ@CX~F.png)
![](https://images2015.cnblogs.com/blog/690962/201605/690962-20160507005516591-1712336470.png)
场景类中采用策略模式选择不同的算法。
具体代码实现:
1 //抽象的策略角色 2 public interface Strategy { 3 //策略模式的运算法则 4 public void doSomething(); 5 } 6 7 //具体策略角色 8 public class ConcreteStrategy1 implements Strategy { 9 public void doSomething() { 10 System.out.println("具体策略1的运算法则"); 11 } 12 } 13 public class ConcreteStrategy2 implements Strategy { 14 public void doSomething() { 15 System.out.println("具体策略2的运算法则"); 16 } 17 } 18 19 //封装场景类 20 public class Context { 21 //抽象策略 22 private Strategy strategy = null; 23 //设置具体策略 24 public setStrategy(Strategy strategy){ 25 this.strategy = strategy; 26 } 27 //封装后的策略方法 28 public void doAnythinig(){ 29 this.strategy.doSomething(); 30 } 31 } 32 33 //场景类 34 public class Client extends Context { 35 public static void main(String[] args) { 36 //一个具体的策略 37 Strategy strategy = new ConcreteStrategy1(); 39 new Client().setStrategy(strategy); 40 //执行封装后的方法 41 context.doAnythinig(); 42 } 43 }
大致的执行代码就就是这样,具体实现细节还要完善。
总结:
首先,算法可以自由切换。这是策略模式本身定义的,只要实现抽象策略,它就成为策略家族的一个成员,通过封
装角色对其进行封装,保证对外提供“可自由切换”的策略。
其次,避免使用多重条件判断。如果没有策略模式,我们想想看会是什么样子?一个策略家族有5个策略算法,一会要
使用A策略,一会要使用B策略,怎么设计呢?使用多重的条件语句?多重条件语句不易维护,而且出错的概率大大增强。使用策略模式后,可以由其他模块决定采用何种策略,策略家族对外提供的访问接口就是封装类,简化了操作,同时避免了条件语句判断。
最后,扩展性良好。在现有的系统中增加一个策略太容易了,只要实现接口就可以了,其他都不用修改,类似于一个可反复拆卸的插件。
![](file:///C:UsersAdministratorAppDataRoamingTencentUsers734425061QQWinTempRichOle1KK9GCUGMU(I_CEWQQ@CX~F.png)
![](file:///C:UsersAdministratorAppDataRoamingTencentUsers734425061QQWinTempRichOle1KK9GCUGMU(I_CEWQQ@CX~F.png)
![](file:///C:UsersAdministratorAppDataRoamingTencentUsers734425061QQWinTempRichOle1KK9GCUGMU(I_CEWQQ@CX~F.png)
![](file:///C:UsersAdministratorAppDataRoamingTencentUsers734425061QQWinTempRichOle1KK9GCUGMU(I_CEWQQ@CX~F.png)
![](file:///C:UsersAdministratorAppDataRoamingTencentUsers734425061QQWinTempRichOle1KK9GCUGMU(I_CEWQQ@CX~F.png)
![](file:///C:UsersAdministratorAppDataRoamingTencentUsers734425061QQWinTempRichOle1KK9GCUGMU(I_CEWQQ@CX~F.png)