深入解析C++編程中對(duì)設(shè)計(jì)模式中的策略模式的運(yùn)用
策略模式也是一種非常常用的設(shè)計(jì)模式,而且也不復(fù)雜。下面我們就來(lái)看看這種模式。
定義:策略模式定義了一系列的算法,并將每一個(gè)算法封裝起來(lái),而且使它們還可以相互替換。策略模式讓算法獨(dú)立于使用它的客戶而獨(dú)立變化。
角色:
- 抽象策略角色(Strategy): 抽象策略類。
- 具體策略角色(ConcreteStrategy):封裝了繼續(xù)相關(guān)的算法和行為。
- 環(huán)境角色(Context):持有一個(gè)策略類的引用,最終給客戶端調(diào)用。
UML圖:
例子:
#include <iostream> using namespace std; class WeaponBehavior { public: void virtual useWeapon() = 0; }; class AK47:public WeaponBehavior { public: void useWeapon() { cout << "Use AK47 to shoot!" << endl; } }; class Knife:public WeaponBehavior { public: void useWeapon() { cout << "Use Knife to kill!" << endl; } }; class Character { public: Character() { weapon = 0; } void setWeapon(WeaponBehavior *w) { this->weapon = w; } void virtual fight() = 0; protected: WeaponBehavior *weapon; }; class King:public Character { public: void fight() { cout << "The king:" ; if ( this->weapon == NULL) { cout << "You don't have a weapon! Please Set Weapon!" << endl; } else { weapon->useWeapon(); } } }; int main() { WeaponBehavior *ak47 = new AK47(); WeaponBehavior *knife = new Knife(); Character *kin = new King(); kin->fight(); cout << endl; kin->setWeapon(ak47); kin->fight(); cout << endl; kin->setWeapon(knife); kin->fight(); return 0; }
適用性:
1,多個(gè)類只區(qū)別在表現(xiàn)行為不同,可以使用Strategy模式,在運(yùn)行時(shí)動(dòng)態(tài)選擇具體要執(zhí)行的行為。
2,需要在不同情況下使用不同的策略(算法),或者策略還可能在未來(lái)用其它方式來(lái)實(shí)現(xiàn)。
3,對(duì)客戶隱藏具體策略(算法)的實(shí)現(xiàn)細(xì)節(jié),彼此完全獨(dú)立。
優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
1,策略模式提供了管理相關(guān)的算法族的辦法。策略類的等級(jí)結(jié)構(gòu)定義了一個(gè)算法或行為族。恰當(dāng)使用繼承可以把公共的代碼移到父類里面,從而避免代碼重復(fù)。
2,使用策略模式可以避免使用多重條件(if-else)語(yǔ)句。多重條件語(yǔ)句不易維護(hù),它把采取哪一種算法或采取哪一種行為的邏輯與算法或行為的邏輯混合在一起,統(tǒng)統(tǒng)列在一個(gè)多重條件語(yǔ)句里面,比使用繼承的辦法還要原始和落后。
缺點(diǎn):
1,客戶端必須知道所有的策略類,并自行決定使用哪一個(gè)策略類。這就意味著客戶端必須理解這些算法的區(qū)別,以便適時(shí)選擇恰當(dāng)?shù)乃惴?。換言之,策略模式只適用于客戶端知道算法或行為的情況。
2,由于策略模式把每個(gè)具體的策略實(shí)現(xiàn)都單獨(dú)封裝成為類,如果備選的策略很多的話,那么對(duì)象的數(shù)目就會(huì)很可觀。
和其他設(shè)計(jì)模式的區(qū)別:
1,與狀態(tài)模式
在解決的問題上,狀態(tài)模式是解決內(nèi)在狀態(tài)的改變,而策略模式是解決內(nèi)部算法的改變。在解決的方法上,狀態(tài)模式是自我控制狀態(tài)的改變,而策略模式是由外部制定使用使用啥策略。
2,簡(jiǎn)單工廠模式
簡(jiǎn)單工廠模式是創(chuàng)建型模式,關(guān)注對(duì)象的創(chuàng)建。策略模式是行為型模式,關(guān)注行為的封裝。簡(jiǎn)單工廠模式是根據(jù)不同的條件返回一個(gè)適合的類給你使用,然后調(diào)用者使用工廠類返回的類去完成相應(yīng)的操作。而策略模式是必須首先創(chuàng)建一個(gè)想使用的類實(shí)例,然后實(shí)例被當(dāng)作參數(shù)傳遞進(jìn)去,既而通過該實(shí)例去調(diào)用不用的算法。在簡(jiǎn)單工廠模式中實(shí)現(xiàn)了通過條件選取一個(gè)類去實(shí)例化對(duì)象,策略模式則將選取相應(yīng)對(duì)象的工作交給模式的使用者,它本身不去做選取工作。
相關(guān)文章
C++實(shí)現(xiàn)拼圖游戲代碼(graphics圖形庫(kù))
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)拼圖游戲代碼,帶有g(shù)raphics圖形庫(kù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05C語(yǔ)言課程設(shè)計(jì)之抽獎(jiǎng)系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言課程設(shè)計(jì)之抽獎(jiǎng)系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12基于C++實(shí)現(xiàn)的哈夫曼編碼解碼操作示例
這篇文章主要介紹了基于C++實(shí)現(xiàn)的哈夫曼編碼解碼操作,結(jié)合實(shí)例形式分析了C++實(shí)現(xiàn)的哈夫曼編碼解碼相關(guān)定義與使用技巧,需要的朋友可以參考下2018-04-04C++用boost.signal實(shí)現(xiàn)多播委托
這篇文章介紹了C++用boost.signal實(shí)現(xiàn)多播委托的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06C++分析類的對(duì)象作類成員調(diào)用構(gòu)造與析構(gòu)函數(shù)及靜態(tài)成員
終于到了對(duì)象的初始化和清理的最后階段了,在這里分享一個(gè)cpp里有多個(gè)類時(shí),一個(gè)類的對(duì)象作為另一個(gè)類成員的時(shí)候構(gòu)造函數(shù)和析構(gòu)函數(shù)調(diào)用的時(shí)機(jī)。還有一個(gè)靜態(tài)成員也是經(jīng)??嫉降狞c(diǎn),在這篇博客將會(huì)詳解其概念并舉出案例鞏固,讓我們開始2022-05-05C語(yǔ)言 makefile學(xué)習(xí)及實(shí)現(xiàn)實(shí)例
這篇文章主要介紹了C語(yǔ)言 makefile學(xué)習(xí)及實(shí)現(xiàn)實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-03-03