P.S. 最近工作不是很忙,多写点东西吧。
之前说过策略和状态从类图上看很像,但是应用场景很不同。状态是context自身的状态变迁(控制可以是在外边,也可以是在具体状态处理函数内)的场景下使用,不同状态对于客户是透明的;而策略,则是客户要求对于context采用不同的策略。这个策略对客户是暴露的。在策略模式用户指定采用哪个策略。当然这个指定可以是在编译时静态绑定(用模板那),也可以是在运行时动态控制(context需要提供接口)。
对于策略模式,还可以增加没有策略时的默认处理,这样大多数情况下用户不用关心具体策略,而只是给高级客户提供个性化定制。
写了一个demo,比较简单,仅仅做个参考:
#include <iostream>
using namespace std;
template <class param>
class Strategy{
public:
Strategy(){}
virtual void Algorithm(param p) = 0;
};
class StrategyA : public Strategy<int>{
public:
StrategyA(){}
~StrategyA(){}
virtual void Algorithm(int p){
cout<<"StrtegyA! p*10: "<<10*p<<endl;
}
};
class StrategyB : public Strategy<int>{
public:
StrategyB(){}
~StrategyB(){}
virtual void Algorithm(int p){
cout<<"StrtegyB! p*0.1: "<<0.1*p<<endl;
}
};
class Context{
public:
Context(){
strategy = NULL;
}
void process(int p){
if (strategy) {
strategy->Algorithm(p);
} else {
cout<<"no strategy! p: "<< p<<endl;
}
}
void set_strategy(Strategy<int> * new_strategy){
strategy = new_strategy;
}
private:
Strategy<int> * strategy;
};
int main(){
Context * con = new Context();
con->process(10);
StrategyA * strategyA = new StrategyA();
con->set_strategy(strategyA);
con->process(10);
StrategyB * strategyB = new StrategyB();
con->set_strategy(strategyB);
con->process(10);
return 0;
}
no strategy! p: 10
StrtegyA! p*10: 100
StrtegyB! p*0.1: 1