C 設計模式之策略模式

2022-09-23 10:06:09 字數 4339 閱讀 9605

這兩年,中國好聲音席捲全國,深受觀眾的青睞,收視率也創造了新高。無論你是否身份低微或是高富帥,都可以通過好聲音這個平台,實現自己的明星夢。緊隨其後,中國好舞蹈等節目鋪天蓋地席捲而來,給選手乙個圓夢的機會。如果想實現明星夢,可以參加中國好聲音,也可以參加中國好舞蹈這些節目,還可以參加星光大道,或者像筷子兄弟一樣,拍攝mv。實現明星夢的方式很多,根據自己的喜愛選擇其中的一種方式。在設計模式中,也存在一種模式,實現某個功能有多種方式,每種方式對應一種演算法,根據需要選擇其中的一種方式來實現這個功能,稱之為策略模式。

1、策略模式

在策略模式中,我們可以定義一些獨立的類來封裝不同的演算法,每乙個類封裝一種具體的演算法,在這裡,每乙個封裝演算法的類我們都可以稱之為一種策略(strategy),為了保證這些策略在使用時具有一致性,一般會提供乙個抽象的策略類來做規則的定義,而每種演算法則對應於乙個具體策略類。

策略模式的主要目的是將演算法的定義與使用分開,也就是將演算法的行為和環境分開,將演算法的定義放在專門的策略類中,每乙個策略類封裝了一種實現演算法,使用演算法的環境類針對抽象策略類進行程式設計,符合「針對抽象進行程式設計原則」。在出現新的演算法時,只需要增加乙個新的實現了抽象策略類的具體策略類即可。策略模式定義如下:

策略模式(strategy pattern):定義一系列演算法類,將每乙個演算法封裝起來,並讓它們可以相互替換,策略模式讓演算法獨立於使用它的客戶而變化,也稱為政策模式(policy)。策略模式是一種物件行為型模式。

策略模式結構並不複雜,但我們需要理解其中環境類context。

在策略模式結構圖中包含如下幾個角色:

context(環境類):環境類是使用演算法的角色,在環境類中維持乙個對抽象策略類的引用例項,用於定義所採用的策略,實際上環境類將呼叫策略類中實現演算法的方法。環境類針對抽象策略進行程式設計,無需知道具體是哪一種策略,只要該策略類中實現了具體的演算法方法就可以。在同一時刻,環境類只能使用一種策略,而不能使用多種。

strategy(抽象策略類):它為所支援的演算法宣告了抽象方法,是所有策略類的父類,它可以是抽象類或具體類,也可以是介面。環境類通過抽象策略類中宣告的方法在執行時呼叫具體策略類中實現的演算法。

concretestrategy(具體策略類):它實現了在抽象策略類中宣告的演算法,在執行時,具體策略類將覆蓋在環境類中定義的抽象策略類物件,使用一種具體的演算法實現某個業務處理。

策略模式是乙個比較容易理解和使用的設計模式,策略模式是對演算法的封裝,它把演算法的責任和演算法本身分割開,委派給不同的物件管理。策略模式通常把乙個系列的演算法封裝到一系列具體策略類裡面,作為抽象策略類的子類。在策略模式中,對環境類和抽象策略類的理解非常重要,環境類是需要使用演算法的類。

2、遊戲**系統的設計與實現

現需要開發一款射擊類遊戲,玩家可以選擇斧頭、手槍、ak47衝鋒槍三種**,每種**都有不同的殺傷力等級,如斧頭殺傷力6級,手槍殺傷力8級,ak47殺傷力10級。要求系統具有擴充套件性,如果有其他的**,可以直接進行擴充套件,請使用策略模式進行設計。

可以設計乙個抽象**類,具體**如斧頭、手槍、ak47繼承於抽象**類。

**類的實現**如下:

#ifndef _weapon_h_

#define _weapon_h_

#include

#include

using namespace std;

//抽象**類(抽象策略)

class weapon

;//手槍(具體策略)

class gun : public weapon

};//ak47衝鋒槍(具體策略)

class ak47 : public weapon

};//斧頭(具體策略)

class axe : public weapon

};#endif

weapon是抽象策略類,具體**gun、ak47、axe是具體的策略類。每個具體策略實現抽象策略中打鬥方法。

現在需要設計乙個遊戲玩家類,也就是環境類,遊戲玩家來使用具體的某種**。遊戲玩家實現**如下:

#ifndef _player_h_

#define _player_h_

#include

#include

#include "weapon.h"

using namespace std;

//遊戲玩家(環境類)

class player

//設定玩家使用的**

void setweapon(weapon * pweapon)

//玩家使用**打鬥

void fight() };

#endif

遊戲玩家player維持乙個**類物件的引用。當玩家需要使用某種**的時候,只需要把**通過setweapon設定給玩家,玩家就可以通過使用這種**進行打鬥操作,實際上呼叫的仍是**類的打鬥方法。測試**實現如下:#include

#include "player.h"

#include "weapon.h"

using namespace std;

int main()

編譯並執行,結果如下:

因為遊戲玩家(環境類)針對抽象**策略進行程式設計。如果需要更換**策略,無需修改**,只需要把具體**策略設定給遊戲玩家就可以了,可以隨時切換**。環境類不需要知道具體使用哪種策略,符合"針對抽象程式設計原則"。如果需要新增新的**,只需要增加乙個新的**類,作為抽象**類的子類,實現抽象類中的打鬥方法。無需修改之前的**,符合"開放封閉原則"。

3、策略模式總結

策略模式用於演算法的自由切換和擴充套件,它是應用較為廣泛的設計模式之一。策略模式對應於解決某一問題的乙個演算法族,允許使用者從該演算法族中任選乙個演算法來解決某一問題,同時可以方便地更換演算法或者增加新的演算法。只要涉及到演算法的封裝、復用和切換都可以考慮使用策略模式。如果需要新增新的策略,只需要增加乙個新的策略類,作為抽象策略類的子類,實現抽象類中的方法,無需修改之前的**,符合"開放封閉原則"。環境類針對抽象策略進行程式設計,如果需要更換,只需要把具體策略設定給環境類就可以了,可以隨時切策略。環境類不需要知道具體使用哪種策略,符合"針對抽象程式設計原則。由於引進了環境類,客戶端不需要直接操作具體策略,而是由環境類對策略進行操作處理。環境類起承上啟下的作用,遮蔽高層模組對策略演算法的直接訪問,封裝可能存在的變化。環境類和策略類是一種組合關係,通過組合實現對策略類**的復用。

1.主要優點

策略模式的主要優點如下:

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

(2) 策略模式提供了管理相關的演算法族的辦法。策略類的等級結構定義了乙個演算法或行為族,恰當使用繼承可以把公共的**移到抽象策略類中,從而避免重複的**。

(3) 使用策略模式可以避免多重條件選擇語句。多重條件選擇語句不易維護,它把採取哪一種演算法或行為的邏輯與演算法或行為本身的實現邏輯混合在一起,將它們全部硬編碼在乙個龐大的多重條件選擇語句中,比直接繼承環境類的辦法還要原始和落後。使用策略模式,if邏輯被封裝到各個策略中。

(4) 策略模式提供了一種演算法的復用機制,由於將演算法單獨提取出來封裝在策略類中,因此不同的環境類可以方便地復用這些策略類。

2.主要缺點

策略模式的主要缺點如下:

(1) 客戶端必須知道所有的策略類,並自行決定使用哪乙個策略類。這就意味著客戶端必須理解這些演算法的區別,以便適時選擇恰當的演算法。換言之,策略模式只適用於客戶端知道所有的演算法或行為的情況。違背"迪公尺特法則,也就是和直接朋友通訊原則",可以通過簡單工廠模式來解決這個問題。

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

(3) 無法同時在客戶端使用多個策略類,也就是說,在使用策略模式時,客戶端每次只能使用乙個策略類,不支援使用乙個策略類完成部分功能後再使用另乙個策略類來完成剩餘功能的情況。

3.策略模式具體應用

(1)電影院打折演算法,成年人全票、vip6折、兒童票與學生票0.5折優惠。

(2)資料匯出:可以匯出到資料庫、也可以匯出到xml,或者文字檔案中。比如:系統異常資訊log,可以記錄到資料庫也可以記錄到檔案中。再如:網頁上的資訊可以轉為word格式儲存,也可以轉為pdf格式儲存。

(3)網路購物,可以選擇貨到付款、也可以選擇u盾支付、還可以選擇支付寶支付等支付方式。

(4)對於加密軟體的開發,可以選擇不同型別的加密演算法,肯定不會只有一種加密演算法。同樣遍歷二叉樹,存在先序遍歷。中序遍歷、後序遍歷、層序遍歷等四種遍歷演算法,根據需要選擇具體的某種遍歷演算法。還有資料結構中的各種排序演算法,根據具體情況選擇某個排序演算法。

(5)qq空間背景風格,可以根據需要選擇某種喜歡的風格,用來裝扮空間。

(6)ui容器管理器,用於管理各種型別控制項布局方式。存在多種不同的布局方式,根據美觀程度,選擇某種布局方式。

(7)生活中的策略: 條條道路通羅馬,36行行行出狀元,描述的就是各種策略;人生面臨著許多選擇,路怎麼走,該往**走。選擇正確,可能一輩子飛黃騰達,選擇錯誤,也許一輩就默默無聞了,這是一種人生選擇策略。

c 設計模式之策略模式

策略模式由多個封裝在乙個稱為context的驅動器類裡的相關演算法組成。客戶端程式可以從這些不同的演算法裡選擇乙個,或者在某些情況下,由context替你選擇乙個最好的演算法,策略模式的意圖是使這些演算法可交換,並提供一種方法來選擇最合適的演算法 策略模式跟工廠模式很像,都是交由客戶端來根據需求動態...

c 設計模式之策略模式

策略模式 它定義了演算法家族,分別封裝起來,讓他們之間可以相互替換,此模式讓演算法的變化不會影響到使用演算法的使用者。二者的相同點是,都是通過多型來實現子類的實現。簡單工廠模式是通過選項生成對應的子類,來進行對應的操作。而策略模式是將生成子類的操作和對子類的操作封裝在了一起,實現了更好的封裝。簡單而...

c 設計模式之策略模式

概念 通過定義一系列封裝的演算法,使得排程者可以互相替換,此模式讓演算法的變化,不會影響到使用演算法的客戶。特點 1 根據不同的情況建立不同的物件。2 每個物件的方法名相同,但實現卻不同。結構 1 乙個抽象策略 2 多個繼承策略 c 持有乙個具體策略類的引用,供客戶端使用 includeusing ...