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)



 














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