Design Pattern-Strategy Pattern策略模式

一.看了《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与模式》的策略模式的学习笔记

定义:策略模式属于对象的行为模式。针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得他们可以互相替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。


1.策略模式的简略图


       

环境(Context)角色:持有一个Strategy的引用。

抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

2.排序系统

  动态地决定采用二元排序(Binary Sort)、泡沫排序(Bubble Sort)、堆栈排序(Heap Sort)、快速排序(Quick Sort)、基数排序(Radix Sort)。使用策略模式把几种排序算法包装到不同的算法类里,让所有的算法具有相同的接口。


三. 实践案例

案例1(来源于http://www.cnblogs.com/java-my-life/archive/2012/05/10/2491891.html)

假设现在要设计一个贩卖各类书籍的电子商务网站的购物车系统。一个最简单的情况就是把所有货品的单价乘上数量,但是实际情况肯定比这要复杂。比如,本网站可能对所有的高级会员提供每本20%的促销折扣;对中级会员提供每本10%的促销折扣;对初级会员没有折扣。

  根据描述,折扣是根据以下的几个算法中的一个进行的:

  算法一:对初级会员没有折扣。

  算法二:对中级会员提供10%的促销折扣。

  算法三:对高级会员提供20%的促销折扣。

       使用策略模式来实现的结构图如下:


代码:

案例2(参考自https://www.jianshu.com/p/0c62bf587b9c)

某家百货公司,针对不同节目使用不同促销活动进行促销


四.策略模式的优点

(1)能动态地选择算法。

(2)能避免使用多重条件转移语句。

五.策略模式的缺点

(1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。

(2)策略模式把每个具体的策略实现都单独封装成类,因为策略模式会造成很多的策略类。

六.Struts2应用策略模式的例子


这些配置加载器的具体实现核心,是一个针对不同数据格式的配置元素的读取过程。由于配置的形式是多种多样的,这就导致了读取配置的算法也各不相同。
(来源于:https://my.oschina.net/winHerson/blog/110823)



 














發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章