Strategy Pattern

[Purpose] 

有時候你的class有某個行為, 但在不同的場景中, 該行為有不同的實現方式。
例如你的遊戲角色, 有"移動"這樣的行為,
在學校中的移動只能慢走
在草原的移動只能跑
在海中的移動只能游
你想角色, 在不同場景, 擁有不同的移動方式
這時候就適合用Strategy Pattern


你的主體context, 擁有一個strategy指標, 可以動態指向不同的strategy實體
用strategy Pattern的好處是 :
1.你可以assign不同的Strategy給context
2.多個context, 每個人都可以擁有自己獨特的Strategy
3.你想要創新的strategy只要建立新的Concrete strategy就好 (open for extension)
4.建立新的Concrete strategy並不影響其他class內的code (close for modification)

[Implementation] 

#include <iostream> using namespace std; class Strategy{ //interface public: virtual void execute() = 0; }; class ConcreteStrategy1 : public Strategy{ public: void execute(){ cout << "run Strategy 1" << endl; } }; class ConcreteStrategy2 : public Strategy{ public: void execute(){ cout << "run Strategy 2" << endl; } }; class Context{ private: Strategy* mystg; public: Context(Strategy* stg) : mystg(stg){} void setstg(Strategy* stg){ delete mystg; mystg = stg; } void runstg(){ mystg->execute(); } }; int main(int argc, char** argv) { Context c1(new ConcreteStrategy2()); c1.runstg(); c1.setstg(new ConcreteStrategy1()); c1.runstg(); return 0; }

輸出:
run Strategy 2
run Strategy 1