大戰設計模式 1 策略模式

2022-02-13 05:49:45 字數 1292 閱讀 4760

策略模式使用的例子

strategy—|

|—oop—nonuse物件導向角度不使用策略模式的例子

|—pop—|

|—nonuse面向過程角度不使用策略模式的例子

|—use使用策略模式的例子

定義一系列演算法類,將每乙個演算法封裝起來,並讓它們可以相互替換。策略模式讓演算法獨立於使用它的客戶而變化。

context(環境類):負責使用演算法策略,其中維持了乙個抽象策略類的引用例項。

strategy(策略類的介面):所有策略類的父類(介面),為所支援的策略演算法宣告了抽象方法。

concretestrategy(具體策略類):實現了在抽象策略類中宣告的方法。

提供了對開閉原則的完美支援,使用者可以在不修改原有系統的基礎上選擇具體演算法或行為,也可以靈活地增加新的演算法或行為。

避免了多重的if-else條件選擇語句,利於系統的維護。

提供了一種演算法的復用機制,不同的環境類可以方便地復用這些策略類。

客戶端需要知道所有的策略類,並自行決定使用哪乙個策略(使用者必須知道每乙個策略類其中的演算法)

將造成系統產生很多的具體策略類,任何細小的變化都將導致系統要增加乙個具體策略類(策略越多,類越多)

無法在客戶端同時使用多個策略類(一次只能使用一種策略)

如果乙個系統要動態地在幾種演算法之間選擇其中一種

如果有難以維護的多重if-else條件選擇語句是為了實現物件的行為

不希望客戶知道複雜的與演算法有關的資料結構,可以將其封裝到策略中

1.從面向過程的角度來說

很多時候,我們需要判斷各種條件後然後執行不同的業務邏輯

而且執行的業務邏輯非常的複雜,我們可以看作乙個個複雜的演算法(策略)

我們可以將其進行拆分為乙個個策略類來實現,從而方便維護,方便復用

2.從物件導向的角度來說

如果使用繼承

如果父類不是抽象方法,那麼容易導致忘記或者遺漏重寫方法,

如果使用抽象方法,那麼每個類都必須去重寫父類的方法,無論你需不需要(有的時候你是不需要的)

而且有可能大多數的**相同時,改動就變得很複雜了

如果使用多個介面實現

那麼如果使用策略a就需要修改為介面a,如果使用策略b就需要修改為介面b

比較麻煩,而且介面多,**復用性就變差了

策略模式使用組合(在類中增加乙個私有域,引用另乙個已有類的例項,通過呼叫引用例項的方法從而獲得新的功能)

足夠的靈活,更加易於維護,策略可以復用

參考部落格:

1 設計模式之策略模式

設計模式的一句話 過分設計是一種罪過,要根據專案實事求是,沒有任何一種設計是一步到位,很多功能都是根據反饋進行改善。1 背景 在實際開發中,我們常常遇見實現某種業務功能時,有許多不同實現方式,使用者可以任意選擇其中的一種方式。例如,在排序某個序列資料時,我們可以選擇氣泡排序 快速排序 插入排序 堆排...

設計模式 二 策略模式 1

策略模式 strategy 它定義了演算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化,不會影響到使用演算法的客戶。結構圖 strategy抽象類,定義所有支援的演算法的公共介面。class strategy 演算法方法 virtual void algorithminte ce...

設計模式 一 策略模式 1

策略模式用到就是 多型 的思想,父類有多個子類,為同乙個行為實現不同的表現形式 舉例 1個中國人,1個印度人,他們都吃飯,但是中國人是用筷子,印度人是用手,這個就是多型,同一行為的2種實現方式 吃飯行為 public inte ce eating中國人和印度人 public class chines...