前言

今天学习策略模式,这个开发中也是很常见的,简单总结于此,方便自己查阅和回顾。

正文

策略模式

策略模式(Strategy Pattern)属于对象的行为模式。定义一系列算法,将每一个算法封装起来,并使它们可以相互替换。

常见情况
  1. 旅行 —> 交通算法 :可以坐高铁,乘飞机,开自己的汽车,也可以骑自行车等。

  2. 支付 —> 支付算法 :可以用支付宝支付,微信支付,云闪付支付,也可以各个银行app(建行,农行,招行等)。

  3. 游戏 —> 打怪算法 :可以用刀,枪,大炮,火箭筒,也可以用拳头等。

主要角色

  1. 抽象策略角色(Strategy)

    是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

  2. 具体策略角色(ConcreteStrategy)

    包装了相关的算法或行为。

  3. 环境角色(Context)

    持有一个策略类的引用,提供给客户端使用。

设计模式之策略模式

优缺点

优点
  1. 比较灵活,可以各种策略可以自由切换

  2. 方便扩展,新增的策略只需要实现抽象策略类即可

缺点
  1. 需要暴露所有的策略类,要不然客户端不知道用哪个

  2. 新增一个策略就要新增一个类

demo

来源参考文章2

抽象策略角色

Strategy是一个抽象角色,通常由一个接口或抽象类实现。

public interface Strategy {
    void algorithm();
}
具体策略角色

ConcreteStrategy包装了相关的算法或行为。

  1. 算法A

    public class ConcreteStrategyA implements Strategy {
        @Override
        public void algorithm() {
            Log.d(TAG, "algorithm A : ");
        }
    }
  2. 算法B

    public class ConcreteStrategyB implements Strategy {
        @Override
        public void algorithm() {
             Log.d(TAG, "algorithm B : ");
        }
    }
  3. 算法C

    public class ConcreteStrategyC implements Strategy {
        @Override
        public void algorithm() {
             Log.d(TAG, "algorithm C : ");
        }
    }
环境角色

Context持有一个策略类的引用,提供给客户端使用。

//这里把Context改为StrategyContext
public class StrategyContext {
    private final Strategy strategy;
    public StrategyContext(Strategy strategy){
        this.strategy = strategy;
    }

    public void algorithm(){
        //真正执行的还是传入的策略中的算法
        strategy.algorithm();
    }
}
客户端
StrategyContext  strategyContext = new StrategyContext(new ConcreteStrategyA());
strategyContext.algorithm();

StrategyContext  strategyContext = new StrategyContext(new ConcreteStrategyB());
strategyContext.algorithm();

需要用哪个算法就传入到StrategyContext(环境角色)中即可。

参考文章

  1. Java进阶篇设计模式之十一 —- 策略模式和模板方法模式

  2. 设计模式-策略模式

相关文章

暂无评论

none
暂无评论...