设计模式——策略模式

个人理解:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值