设计模式——策略模式

来源:互联网 发布:英国知名网络品牌 编辑:程序博客网 时间:2024/06/03 21:55

个人理解:

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 -----------");    }}
ConcreteStrategyB:

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 -----------