策略模式(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 }
执行结果: