我所理解的设计模式(C++实现)——策略模式(Strategy Pattern)
概述:
每個人都要“交個人所得稅”,但是“在美國交個人所得稅”和“在中國交個人所得稅”就有不同的算稅方法。 而策略模式就是對算法進行包裝,是把使用算法的責任和算法本身分割開來,委派給不同的對象管理。策略模式通常把一個系列的算法包裝到一系列的策略類里面,作為一個抽象策略類的子類。用一句話來說,就是:“準備一組算法,并將每一個算法封裝起來,使得它們可以互換”。
類圖與實例:
Context(應用場景):
1、需要使用ConcreteStrategy提供的算法。
2、內部維護一個Strategy的實例。
3、負責動態設置運行時Strategy具體的實現算法。
4、負責跟Strategy之間的交互和數據傳遞。
Strategy(抽象策略類):定義了一個公共接口,各種不同的算法以不同的方式實現這個接口,Context使用這個接口調用不同的算法,一般使用接口或抽象類實現。
ConcreteStrategy(具體策略類):實現了Strategy定義的接口,提供具體的算法實現。
???
?
這里用CS里的人物作為例子,每個人都可以有幾個武器,武器之間動態切換,武器擁有統一的攻擊命令:
#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():m_weapon(nullptr){}void setWeapon(WeaponBehavior *w){this->m_weapon = w;}void virtual fight() = 0;protected:WeaponBehavior *m_weapon; };class King:public Character { public:void fight(){cout << "The king:" ;if ( this->m_weapon == nullptr){cout << "You don't have a weapon! Please Set Weapon!" << endl;}else{?m_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,多個類只區別在表現行為不同,可以使用Strategy模式,在運行時動態選擇具體要執行的行為。
2,需要在不同情況下使用不同的策略(算法),或者策略還可能在未來用其它方式來實現。
3,對客戶隱藏具體策略(算法)的實現細節,彼此完全獨立。
優缺點:
優點:
1,策略模式提供了管理相關的算法族的辦法。策略類的等級結構定義了一個算法或行為族。恰當使用繼承可以把公共的代碼移到父類里面,從而避免代碼重復。
2,使用策略模式可以避免使用多重條件(if-else)語句。多重條件語句不易維護,它把采取哪一種算法或采取哪一種行為的邏輯與算法或行為的邏輯混合在一起,統統列在一個多重條件語句里面,比使用繼承的辦法還要原始和落后。
缺點:
1,客戶端必須知道所有的策略類,并自行決定使用哪一個策略類。這就意味著客戶端必須理解這些算法的區別,以便適時選擇恰當的算法類。換言之,策略模式只適用于客戶端知道算法或行為的情況。
2,由于策略模式把每個具體的策略實現都單獨封裝成為類,如果備選的策略很多的話,那么對象的數目就會很可觀。
和其他設計模式的區別:
1,與狀態模式
在解決的問題上,狀態模式是解決內在狀態的改變,而策略模式是解決內部算法的改變。在解決的方法上,狀態模式是自我控制狀態的改變,而策略模式是由外部制定使用使用啥策略。
2,簡單工廠模式
簡單工廠模式是創建型模式,關注對象的創建。策略模式是行為型模式,關注行為的封裝。簡單工廠模式是根據不同的條件返回一個適合的類給你使用,然后調用者使用工廠類返回的類去完成相應的操作。而策略模式是必須首先創建一個想使用的類實例,然后實例被當作參數傳遞進去,既而通過該實例去調用不用的算法。在簡單工廠模式中實現了通過條件選取一個類去實例化對象,策略模式則將選取相應對象的工作交給模式的使用者,它本身不去做選取工作。
更多:https://blog.csdn.net/wuzhekai1985/article/details/6665197
總結
以上是生活随笔為你收集整理的我所理解的设计模式(C++实现)——策略模式(Strategy Pattern)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sarama-cluster之panic
- 下一篇: 设计模式C++实现——观察者模式