《JAVA与模式》之策略模式
策略模式的定义
定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。
策略模式使这些算法在客户端调用它们的时候能够互不影响地变化。
策略模式的组成
抽象策略角色:策略类,通常由一个接口或者抽象类实现。
具体策略角色:包装了相关的算法和行为。
环境角色:持有一个策略类的引用,最终给客户端用的。
一个简单的例子
1 public class Strategy { 2 3 4 public static void main(String[] args) { 5 6 IStrategy iStrategy =new StrategyB(); 7 Context context =new Context(iStrategy); 8 context.doStrategy(); 9 } 10 11 } 12 13 14 15 class Context{ 16 17 private IStrategy iStrategy; 18 19 public Context(IStrategy iStrategy){ 20 21 this.iStrategy=iStrategy; 22 } 23 24 25 public void doStrategy(){ 26 27 iStrategy.say(); 28 29 } 30 31 } 32 33 34 interface IStrategy{ 35 36 public void say(); 37 38 } 39 40 class StrategyA implements IStrategy{ 41 42 @Override 43 public void say() { 44 System.out.println("StrategyA"); 45 } 46 } 47 class StrategyB implements IStrategy{ 48 49 @Override 50 public void say() { 51 System.out.println("StrategyB"); 52 } 53 } 54 class StrategyC implements IStrategy{ 55 56 @Override 57 public void say() { 58 System.out.println("StrategyC"); 59 } 60 }
拓展联想:如何设计一个计算器 包含加减乘除四个策略
策略模式的缺点:客户端必须知道有多少个可用策略,每一个策略都要创建一个对象,可使用工厂模式来解决
策略模式与状态模式的区别
1.状态模式之间的实现类是互斥的,而对策模式则是并行的
2.策略模式是由客户端来控制具体使用哪个策略
而状态模式是需要通过state或则context自身来做判断管理的
策略模式配合工厂模式解决If else 过多的问题
StateFactory.java static Map<String,Class> states = new HashMap<String,Class>(); static{ states.put("A",ConcreteStateA.class); states.put("B",ConcreteStateB.class); } public static State createState(String key){ return (State)states.get(key).newInstance(); } //调用 StateFactory.createState(state).handle();
参考:
http://www.cnblogs.com/java-my-life/archive/2012/05/10/2491891.html
http://www.cnblogs.com/mengdd/archive/2013/01/19/2867443.html
http://yangguangfu.iteye.com/blog/815107
http://www.iteye.com/topic/1112645?page=1