定義一組演算法,將每個演算法都封裝起來,並且使他們之間可以互換。
策略模式是對演算法的封裝,把一系列的演算法分別封裝到對應的類中,並且這些類實現相同的介面,相互之間可以替換。
在前面說過的行為類模式中,有一種模式也是關注對演算法的封裝
——模版方法模式,策略模式與模版方法模式的區別僅僅是多了乙個單獨的封裝類
context
,它與模版方法模式的區別在於:在模版方法模式中,呼叫演算法的主體在抽象的父類中,而在策略模式中,呼叫演算法的主體則是封裝到了封裝類
context
中,抽象策略
strategy
一般是乙個介面,目的只是為了定義規範,裡面一般不包含邏輯。其實,這只是通用實現,而在實際程式設計中,因為各個具體策略實現類之間難免存在一些相同的邏輯,為了避免重複的**,我們常常使用抽象類來擔任
strategy
的角色,在裡面封裝公共的**,因此,在很多應用的場景中,在策略模式中一般會看到模版方法模式的影子。
模板方法更加強調:
1)定義一條線(演算法流程),線上的多個點是可以變化的(具體實現在子類中完成),線上的多個點一定是會被執行的,並且一定是按照特定流程被執行的。
2)演算法流程只有唯一的入口,對於點的訪問是受限的【通常用受保護的虛函式來定義可變點】。
策略模式更注重於: 乙個「策略」是乙個 整體的(完整的) 演算法,演算法是可以被整體替換的。而模板方法只能被替換其中的特定點,演算法流程是固定不可變的。
1. inte***ce istrategy
4. class concretestrategy1 implements istrategy
8. }
9. class concretestrategy2 implements istrategy
13. }
14. class context
20.
21. public void execute()
24. }
25.
26. public class client
37. }
策略類之間可以自由切換,由於策略類實現自同乙個抽象,所以他們之間可以自由切換。
易於擴充套件,增加乙個新的策略對策略模式來說非常容易,基本上可以在不改變原有**的基礎上進行擴充套件。
避免使用多重條件,如果不使用策略模式,對於所有的演算法,必須使用條件語句進行連線,通過條件判斷來決定使用哪一種演算法,使用多重條件判斷是非常不容易維護的。
策略模式的缺點主要有兩個:
必須對客戶端(呼叫者)暴露所有的策略類,因為使用哪種策略是由客戶端來決定的,因此,客戶端應該知道有什麼策略,並且了解各種策略之間的區別,否則,後果很嚴重。例如,有乙個排序演算法的策略模式,提供了快速排序、氣泡排序、選擇排序這三種演算法,客戶端在使用這些演算法之前,是不是先要明白這三種演算法的適用情況?再比如,客戶端要使用乙個容器,有鍊錶實現的,也有陣列實現的,客戶端是不是也要明白鍊錶和陣列有什麼區別?就這一點來說是有悖於迪公尺特法則的。
做物件導向設計的,對策略模式一定很熟悉,因為它實質上就是物件導向中的繼承和多型,在看完策略模式的通用**後,至少在在以下兩種情況下,大家可以考慮使用策略模式,
幾個類的主要邏輯相同,只在部分邏輯的演算法和行為上稍有區別的情況。
有幾種相似的行為,或者說演算法,客戶端需要動態地決定使用哪一種,那麼可以使用策略模式,將這些演算法封裝起來供客戶端呼叫。
策略模式是一種簡單常用的模式,我們在進行開發的時候,會經常有意無意地使用它,一般來說,策略模式不會單獨使用,跟模版方法模式、工廠模式等混合使用的情況比較多。
簡單**模式與策略模式在功能上的很大的區別是:
簡單**模式中,**類知道被**類的行為,因為**類與被**類實現的是同乙個介面,因此**類與被**類的結構是相同的;
而策略模式中,策略容器並不知道內部策略的詳細資訊,因為容器並沒有實現與內部策略相同的介面,即容器與內部策略只是簡單的組合關係,容器只是將內部策略的行為抽取出來,進行了統一的實現。
策略 Strategy 模式
strategy 模式也叫策略模式,是由 gof提出的 23種軟體設計模式的一種。strategy 模式是行為模式之一,它對一系列的演算法加以封裝,為所有演算法定義乙個抽象的演算法介面,並通過繼承該抽象演算法介面對所有的演算法加以封裝和實現,具體的演算法選擇交由客戶端決定 策略 strategy 模...
策略模式 Strategy
public context string strategytype df對策略模式的定義是這樣的 它定義了演算法家族,分別封裝起來,讓它們之間可以相互替換,此模式讓演算法的變化不會影響到使用演算法的客戶 main函式 abstract class strategy class concretest...
策略模式 Strategy
定義 定義一組演算法,將每個演算法都封裝起來,並且使他們之間可以互換。型別 行為類模式 結構圖 策略模式的優缺點 策略模式的主要優點有 策略模式的缺點主要有兩個 必須對客戶端 呼叫者 暴露所有的策略類,因為使用哪種策略是由客戶端來決定的,因此,客戶端應該知道有什麼策略,並且了解各種策略之間的區別,否...