背景
最近在重构项目的一个大功能,一开始使用的是通过if-else的方式判断不同的状态来处理不同的业务,最后发现这样做代码可维护性很低,扩展性很差,所以后来改为用策略模式来处理。
定义
策略模式使用的就是面向对象的继承和多态机制,非常容易理解和掌握,我们再来看看 策略模式的三个角色:
- Context封装角色 它也叫做上下文角色,起承上启下封装作用,屏蔽高层模块对策略、算法的直接访问, 封装可能存在的变化。
- Strategy抽象策略角色 策略、算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性。各位看官可能要问了,类图中的AlgorithmInterface是什么意思,嘿嘿,algorithm是“运算法则”的意思,结合起来意思就明白了吧。
- ConcreteStrategy具体策略角色 实现抽象策略中的操作,该类含有具体的算法。
实战
概况
我用优惠卷来做为例子,分别有不同的优惠卷(打折券、满减券等等),判断类型来走不同的优惠的策略
原理图
代码
CouponContext类主要是用来生成实现CouponStrategy类的集合,然后通过遍历找到符合条件的优惠卷
@Service
public class