Design Pattern-Strategy === # 策略模式(Strategy) * 為一種行為模式 * 使用時機 : 如有大量if/else出現來決定不同使用方法時可以使用 * 目的 : 讓各方法較好維護且介面統一提昇程式可讀性 * 優點 : * 隨意切換 * 每個"策略"被裝進單獨的類別中開發較好理解與維護 * 缺點 : * 客戶端必須清楚知道不同策略之間差異,才有辦法選擇到適合的演算法 * 物件類別的數量增加,因為每個算法實作都將被獨立宣告成一個類別 # Flow chart <img style="display:block;margin:48px auto;padding:1px;border:1px #eee;width:50%;" src="https://hackmd.io/_uploads/By9y6UnMR.png" /> * ConcreteStrategyA跟ConcreteStrategy最後都被統一成Strategy的樣式去執行並透過Context使用 * source : https://en.wikipedia.org/wiki/Strategy_pattern * https://hypc-pub.github.io/design-patterns/patterns/strategy-pattern.html # 舉例 : 人移動的方式 * 我們將人的動作獨立一個action的class,go的目的是要移動到下一個目的地的方式 ```cpp= class action{ public: action(){}; virtual void go()=0; virtual ~action(){}; }; ``` * 我們可以靠騎車、開車、或跑步的方式移動,取需要一個User來去使用這些方式,於是User就有上述移動方式作為他的策略,可以看到User本身只要選取特定策略執行就好,根本不需要知道各個策略的細節。 ```cpp= class ride : public action{ public: void go() override{ cout << " is riding!" << endl; } }; class drive : public action{ public: void go() override{ cout << " is driving!" << endl; } }; class run : public action{ public: void go() override{ cout << " is running!" << endl; } }; class User{ public: string name; User(string user){ name = user; } ~User(){}; void choose(std::shared_ptr<action>&act){ action_to_do = act; } void go(){ cout << name; action_to_do->go(); } private: std::shared_ptr<action>action_to_do=nullptr; }; ``` # 最後輸出 今天如果要改成drive的話只要將strategy的部分改成drive即可 ```cpp= int main(){ std::shared_ptr<User> Jack = std::make_shared<User>("Jack"); std::shared_ptr<action> strategy= std::make_shared<run>(); Jack->choose(strategy); Jack->go(); return 0; } ```  github : https://github.com/GU-Lin/Design_Pattern_Practice/tree/main/Behavioral/Strategy ###### tags : `Behavioral` `DesignPattern`
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up