今天学习策略模式,这个开发中也是很常见的,简单总结于此,方便自己查阅和回顾。
正文
策略模式(Strategy Pattern)属于对象的行为模式。定义一系列算法,将每一个算法封装起来,并使它们可以相互替换。
常见情况
- 旅行 ---> 交通算法 :可以坐高铁,乘飞机,开自己的汽车,也可以骑自行车等。 
- 支付 ---> 支付算法 :可以用支付宝支付,微信支付,云闪付支付,也可以各个银行app(建行,农行,招行等)。 
- 游戏 ---> 打怪算法 :可以用刀,枪,大炮,火箭筒,也可以用拳头等。 
主要角色
- 抽象策略角色(Strategy) - 是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。 
- 具体策略角色(ConcreteStrategy) - 包装了相关的算法或行为。 
- 环境角色(Context) - 持有一个策略类的引用,提供给客户端使用。 

优缺点
优点
- 比较灵活,可以各种策略可以自由切换 
- 方便扩展,新增的策略只需要实现抽象策略类即可 
缺点
- 需要暴露所有的策略类,要不然客户端不知道用哪个 
- 新增一个策略就要新增一个类 
demo
来源参考文章2
抽象策略角色
Strategy是一个抽象角色,通常由一个接口或抽象类实现。
public interface Strategy { void algorithm(); }
具体策略角色
ConcreteStrategy包装了相关的算法或行为。
- 算法A - public class ConcreteStrategyA implements Strategy { @Override public void algorithm() { Log.d(TAG, "algorithm A : "); } } 
- 算法B - public class ConcreteStrategyB implements Strategy { @Override public void algorithm() { Log.d(TAG, "algorithm B : "); } } 
- 算法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(环境角色)中即可。
参考文章
- 《》 
- 《 
