前言
今天学习策略模式,这个开发中也是很常见的,简单总结于此,方便自己查阅和回顾。
正文
策略模式
策略模式(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(环境角色)中即可。
参考文章
《》
《
© 版权声明