定义:
将可变的部分从程序中抽象分离成算法接口,在该接口下分别封装一系列算法实现。并使他们可以相互替换,从而导致客户端程序独立于算法的改变。
注:针对同一类型操作,将复杂多样的处理方式分别开来,有选择的实现各自特有的操作。
模式的使用场合
1:针对同一类型问题的多种处理方式,仅仅是具体行为有差别时
2:出现同一抽象多个子类,而又需要使用if-else 或者 switch-case来选择时。
本篇博客我将以商店收银作为例子:
一般有些店,会根据顾客在该店的购物情况,会推出顾客等级,有普通顾客、中级会员、高级会员。普通用户不能享受折扣,只会添加积分。而中级会员会享受9折的折扣,并积累积分。高级用户可以享受8级折扣,并累加积分。
我们想,如果结算的时候,收银员可根据你的等级和购物的总额计算,来收取最终钱。想必折就设计的算法,如果用if/else来实现的话,把几个等级计算的算法都放在了一起,当需要改变折扣或者添加超级会员的时刻,我们就要改变整个类。
对于收银系统来说,他不关注会员等级和折扣的关系,更不会关注算法改动的情况。只会根据不同等级使用不同的算法来计算。
其他概念:
组合:组合就是 A类的对象是B类的成员变量(在下面的例子中你将看到,顾客(Member)将作为Cashier的成员变量)
在介绍策略模式的具体实现方式之前,再来巩固一下几个面向对象设计原则:封装变化、多用组合,少用继承、针对接口编程,不针对实现编程。想一想如何运用到策略模式中,并且有什么好处。
实现过程
先定义一个接口,这个接口就是抽象策略类,该接口定义了计算价格方法,具体实现方式由具体的策略类来定义。
针对不同的会员,定义三种具体的策略类,每个类中都分别实现计算价格方法。
普通顾客:
中级会员
超级会员
上面几个类,即体现了封装变化的原则,因为不同顾客有不同的折扣计算方法,并且会不影响的。
下面在定义一个环境类,也就是集成这些算法的类
最后定义一个客户端的测试类: