个人理解:
1. 策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。
2. 策略模式是将对象的行为模式抽象为一个类,可以改变行为而不影响对象本身
3. UML图:
4. 包含部分:
环境(Context)角色:持有一个Strategy的引用。
抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
5. 示例代码:
Strategy:
public interface Strategy { void travel(); }
ConcreteStrategyA:
public class StrategyByBike implements Strategy { @Override public void travel() { Log.i("StrategyByBus","----------- travel By Bike -----------"); } }Concrete StrategyB:
public class StrategyByBus implements Strategy { @Override public void travel() { Log.i("StrategyByBus","----------- travel By Bus -----------"); } }
ConcreteStrategyC:
public class StrategyByPlane implements Strategy { @Override public void travel() { Log.i("StrategyByBus","----------- travel By Plane -----------"); } }
Context:
public class StrategyKeep { private Strategy strategy; public StrategyKeep(Strategy strategy) { this.strategy = strategy; } public void setStrategy(Strategy strategy) { this.strategy = strategy; } public void travel(){ strategy.travel(); } }
客户端调用:
private void factoryStrategy(){ Strategy strategy = new StrategyByBike(); StrategyKeep keep = new StrategyKeep(strategy); keep.travel(); Log.i("factoryFlyweight", "****************换个方式****************\n"); Strategy strategy1 = new StrategyByBus(); keep.setStrategy(strategy1); keep.travel(); Log.i("factoryFlyweight", "****************再换个方式****************\n"); Strategy strategy2 = new StrategyByPlane(); keep.setStrategy(strategy2); keep.travel(); }
运行结果:
12-20 15:20:07.943 9180-9180/com.wdp.designtest I/StrategyByBus: ----------- travel By Bike -----------
12-20 15:20:07.943 9180-9180/com.wdp.designtest I/factoryFlyweight: ****************换个方式****************
12-20 15:20:07.943 9180-9180/com.wdp.designtest I/StrategyByBus: ----------- travel By Bus -----------
12-20 15:20:07.943 9180-9180/com.wdp.designtest I/factoryFlyweight: ****************再换个方式****************
12-20 15:20:07.943 9180-9180/com.wdp.designtest I/StrategyByBus: ----------- travel By Plane -----------