策略模式也是一種非常常用的設(shè)計(jì)模式,而且也不復(fù)雜。下面我們就來看看這種模式。
定義:策略模式定義了一系列的算法,并將每一個(gè)算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨(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í)動態(tài)選擇具體要執(zhí)行的行為。
2,需要在不同情況下使用不同的策略(算法),或者策略還可能在未來用其它方式來實(shí)現(xiàn)。
3,對客戶隱藏具體策略(算法)的實(shí)現(xiàn)細(xì)節(jié),彼此完全獨(dú)立。
優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
1,策略模式提供了管理相關(guān)的算法族的辦法。策略類的等級結(jié)構(gòu)定義了一個(gè)算法或行為族。恰當(dāng)使用繼承可以把公共的代碼移到父類里面,從而避免代碼重復(fù)。
2,使用策略模式可以避免使用多重條件(if-else)語句。多重條件語句不易維護(hù),它把采取哪一種算法或采取哪一種行為的邏輯與算法或行為的邏輯混合在一起,統(tǒng)統(tǒng)列在一個(gè)多重條件語句里面,比使用繼承的辦法還要原始和落后。
缺點(diǎn):
1,客戶端必須知道所有的策略類,并自行決定使用哪一個(gè)策略類。這就意味著客戶端必須理解這些算法的區(qū)別,以便適時(shí)選擇恰當(dāng)?shù)乃惴悺Q言之,策略模式只適用于客戶端知道算法或行為的情況。
2,由于策略模式把每個(gè)具體的策略實(shí)現(xiàn)都單獨(dú)封裝成為類,如果備選的策略很多的話,那么對象的數(shù)目就會很可觀。
和其他設(shè)計(jì)模式的區(qū)別:
1,與狀態(tài)模式
在解決的問題上,狀態(tài)模式是解決內(nèi)在狀態(tài)的改變,而策略模式是解決內(nèi)部算法的改變。在解決的方法上,狀態(tài)模式是自我控制狀態(tài)的改變,而策略模式是由外部制定使用使用啥策略。
2,簡單工廠模式
簡單工廠模式是創(chuàng)建型模式,關(guān)注對象的創(chuàng)建。策略模式是行為型模式,關(guān)注行為的封裝。簡單工廠模式是根據(jù)不同的條件返回一個(gè)適合的類給你使用,然后調(diào)用者使用工廠類返回的類去完成相應(yīng)的操作。而策略模式是必須首先創(chuàng)建一個(gè)想使用的類實(shí)例,然后實(shí)例被當(dāng)作參數(shù)傳遞進(jìn)去,既而通過該實(shí)例去調(diào)用不用的算法。在簡單工廠模式中實(shí)現(xiàn)了通過條件選取一個(gè)類去實(shí)例化對象,策略模式則將選取相應(yīng)對象的工作交給模式的使用者,它本身不去做選取工作。




















