一.看了《Head First Design Pattern》的策略模式的学习笔记
1. Design Principle: Identify the aspects of your application that vary and seperate them from what stays the same. 识别出应用中变化的部分,并将它们与不变的部分分离开。
Take the parts that vary and encapsulate(封装) them, so that later you can alter or extend the parts that vary without affecting those that don't.把变化的部分取出并封装,因此以后改动或扩展这部分不会影响其他部分。
Duck类中的fly()和quack()会随着鸭子的不同而改变。因此可以把飞和叫这两个行为抽取出来。
2.设计鸭子的行为
Design Principle: Program to an interface, not an implementation.针对接口编程,而不是针对实现编程。
利用多态,让接口代表每个行为。因为鸭子的行为也有实例变量和方法。
3.The Big Picture on encapsulated behaviors
4.HAS-A can be better than IS-A
Design Principle:Favor composition over inheritance.多用组合少用继承。
5.The Strategy Pattern defines a family of algorithms, encapsulates each one, and makes them interchangable(互换). Strategy lets the algorithm vary independently from clients that use it.
二. 看了阎宏博士的《Java与模式》的策略模式的学习笔记
环境(Context)角色:持有一个Strategy的引用。
抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
2.排序系统
动态地决定采用二元排序(Binary Sort)、泡沫排序(Bubble Sort)、堆栈排序(Heap Sort)、快速排序(Quick Sort)、基数排序(Radix Sort)。使用策略模式把几种排序算法包装到不同的算法类里,让所有的算法具有相同的接口。
三. 实践案例
假设现在要设计一个贩卖各类书籍的电子商务网站的购物车系统。一个最简单的情况就是把所有货品的单价乘上数量,但是实际情况肯定比这要复杂。比如,本网站可能对所有的高级会员提供每本20%的促销折扣;对中级会员提供每本10%的促销折扣;对初级会员没有折扣。
根据描述,折扣是根据以下的几个算法中的一个进行的:
算法一:对初级会员没有折扣。
算法二:对中级会员提供10%的促销折扣。
算法三:对高级会员提供20%的促销折扣。
使用策略模式来实现的结构图如下:
代码:
案例2(参考自https://www.jianshu.com/p/0c62bf587b9c)
某家百货公司,针对不同节目使用不同促销活动进行促销
四.策略模式的优点
(1)能动态地选择算法。
(2)能避免使用多重条件转移语句。
五.策略模式的缺点
(1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
(2)策略模式把每个具体的策略实现都单独封装成类,因为策略模式会造成很多的策略类。