策略模式(Strategy)
定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
CashSuper: 收费计算策略抽象类
正常收费类: 正常收费。acceptCash() 办法 直接返回金额
打折收费类: 需要在构造器中初始化打折参数 在acceptCash() 办法进行打折计算
满多少返利类:需要在构造器中初始化 满多少条件 参数。返利多少 参数,在acceptCash() 办法进行计算。满足条件,总金额-返利金额=返回金额。
客户端使用的时候。只需要 new CashContext(“判断参数”)。然后调用 getResult()。得到最终的计算结果。因为 CashContext 类的构造器根据传入的参数已经得到了具体的计算策略对象了。
何时使用
- 一个系统有许多类,而区分它们的只是他们直接的行为时
2. 方法
- 将这些算法封装成一个一个的类,任意的替换
3. 优点
- 算法可以自由切换
- 避免使用多重条件判断(如果不用策略模式我们可能会使用多重条件语句,不利于维护)
- 扩展性良好,增加一个策略只需实现接口即可
4. 缺点
- 策略类数量会增多,每个策略都是一个类,复用的可能性很小
- 所有的策略类都需要对外暴露
5. 使用场景
- 多个类只有算法或行为上稍有不同的场景
- 算法需要自由切换的场景
- 需要屏蔽算法规则的场景
6. 应用实例
- 出行方式,自行车、汽车等,每一种出行方式都是一个策略
- 商场促销方式,打折、满减等
- Java AWT中的LayoutManager,即布局管理器