有時候你的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)
#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