设计模式14 策略模式

策略模式(Strategy)定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。

策略模式的优点:

1、多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句。

2、策略模式提供了一系列的可供重用的算法族,恰当使用继承可以把算法族的公共代码转移到父类里面,从而避免重复的代码。

3、策略模式可以提供相同行为的不同实现,客户可以根据不同时间或空间要求选择不同的。

4、策略模式提供了对开闭原则的完美支持,可以在不修改原代码的情况下,灵活增加新算法。

5、策略模式把算法的使用放到环境类中,而算法的实现移到具体策略类中,实现了二者的分离。

环境类:

 1 public class Context {
 2     private Strategy strategy;
 3 
 4     public Strategy getStrategy() {
 5         return strategy;
 6     }
 7 
 8     public void setStrategy(Strategy strategy) {
 9         this.strategy = strategy;
10     }
11 
12     public void strategyMethod() {
13         strategy.strategyMethod();
14     }
15 }

策略类:

 1 public interface Strategy {
 2     public void strategyMethod();
 3 }
 4 
 5 public class ConcreteStrategyA implements Strategy {
 6     @Override
 7     public void strategyMethod() {
 8         // TODO Auto-generated method stub
 9         System.out.println("策略A");
10     }
11 }
12 
13 public class ConcreteStrategyB implements Strategy {
14     @Override
15     public void strategyMethod() {
16         // TODO Auto-generated method stub
17         System.out.println("策略B");
18     }
19 }

调用方式:

 1 public class Client {
 2     /*
 3      * 例子:通用类库DBHelper
 4      * 无论连接SQLServer/Oracel/MySql数据库
 5      * 不同的对象,具有相同的使用方式Context
 6      */
 7     public static void main(String[] args) {
 8         //多个类有相似的功能,客户将具体的类传入Context,调用Context统一的方法实现具体功能
 9         Strategy strategy;//扩展点
10         
11         //使用策略A
12         strategy = new ConcreteStrategyA();
13         
14         //扩展点(封装了变化点)->切换策略B
15         //strategy = new ConcreteStrategyB();
16         
17         //稳定代码
18         Context context = new Context();
19         context.setStrategy(strategy);
20         context.strategyMethod();
21     }    
22 }

执行结果:

原文地址:https://www.cnblogs.com/asenyang/p/12111063.html