设计模式(四)-策略模式

定义:

将可变的部分从程序中抽象分离成算法接口,在该接口下分别封装一系列算法实现。并使他们可以相互替换,从而导致客户端程序独立于算法的改变。

注:针对同一类型操作,将复杂多样的处理方式分别开来,有选择的实现各自特有的操作。

模式的使用场合
1:针对同一类型问题的多种处理方式,仅仅是具体行为有差别时
2:出现同一抽象多个子类,而又需要使用if-else 或者 switch-case来选择时。

本篇博客我将以商店收银作为例子:

一般有些店,会根据顾客在该店的购物情况,会推出顾客等级,有普通顾客、中级会员、高级会员。普通用户不能享受折扣,只会添加积分。而中级会员会享受9折的折扣,并积累积分。高级用户可以享受8级折扣,并累加积分。

我们想,如果结算的时候,收银员可根据你的等级和购物的总额计算,来收取最终钱。想必折就设计的算法,如果用if/else来实现的话,把几个等级计算的算法都放在了一起,当需要改变折扣或者添加超级会员的时刻,我们就要改变整个类。

对于收银系统来说,他不关注会员等级和折扣的关系,更不会关注算法改动的情况。只会根据不同等级使用不同的算法来计算。


其他概念:
组合:组合就是 A类的对象是B类的成员变量(在下面的例子中你将看到,顾客(Member)将作为Cashier的成员变量)

在介绍策略模式的具体实现方式之前,再来巩固一下几个面向对象设计原则:封装变化、多用组合,少用继承、针对接口编程,不针对实现编程。想一想如何运用到策略模式中,并且有什么好处。

实现过程
先定义一个接口,这个接口就是抽象策略类,该接口定义了计算价格方法,具体实现方式由具体的策略类来定义。

针对不同的会员,定义三种具体的策略类,每个类中都分别实现计算价格方法。
普通顾客:



中级会员


超级会员


上面几个类,即体现了封装变化的原则,因为不同顾客有不同的折扣计算方法,并且会不影响的。
下面在定义一个环境类,也就是集成这些算法的类


最后定义一个客户端的测试类:



优点:

  • 结构清晰明了、使用简单直观。
  • 耦合度相对而言较低,扩展方便。
  • 操作封装也更为彻底,数据更为安全。

缺点:

  • 随着策略的增加,子类也会变得繁多。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值