策略模式的定义
定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。
策略模式使这些算法在客户端调用它们的时候能够互不影响地变化。
策略模式的组成
抽象策略角色:策略类,通常由一个接口或者抽象类实现。
具体策略角色:包装了相关的算法和行为。
环境角色:持有一个策略类的引用,最终给客户端用的。
一个简单的例子
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 @Override43 public void say() {44 System.out.println("StrategyA");45 }46 }47 class StrategyB implements IStrategy{48 49 @Override50 public void say() {51 System.out.println("StrategyB");52 }53 }54 class StrategyC implements IStrategy{55 56 @Override57 public void say() {58 System.out.println("StrategyC");59 }60 }
拓展联想:如何设计一个计算器 包含加减乘除四个策略
策略模式的缺点:客户端必须知道有多少个可用策略,每一个策略都要创建一个对象,可使用工厂模式来解决
策略模式与状态模式的区别
1.状态模式之间的实现类是互斥的,而对策模式则是并行的
2.策略模式是由客户端来控制具体使用哪个策略
而状态模式是需要通过state或则context自身来做判断管理的
策略模式配合工厂模式解决If else 过多的问题
StateFactory.javastatic Mapstates = new HashMap ();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