策略模式(Strategy )

策略模式:定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。

我下面就自己画类图说明自己心里理解的策略模式。

场景类中采用策略模式选择不同的算法。

  具体代码实现:

 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策略,怎么设计呢?使用多重的条件语句?多重条件语句不易维护,而且出错的概率大大增强。使用策略模式后,可以由其他模块决定采用何种策略,策略家族对外提供的访问接口就是封装类,简化了操作,同时避免了条件语句判断。

最后,扩展性良好。在现有的系统中增加一个策略太容易了,只要实现接口就可以了,其他都不用修改,类似于一个可反复拆卸的插件。

 

原文地址:https://www.cnblogs.com/xubiao/p/5467610.html