策略模式即根据不同的场景确定不同的策略,在运行时选取相应的策略,注入上下文,通过上下文调用相应的算法:
class Strategy{
public:
virtual ~Strategy() = default;
virtual void excute() const = 0;
};
//定义策略虚基类;
class ConcreteStrategyA : public Strategy{
void excute() const {
cout<<"ConcreteStrategyA\n";
}
};
//根据A策略继承虚基类,实现具体的策略逻辑;
class ConcreteStrategyB : public Strategy{
void excute() const {
cout<<"ConcreteStrategyB\n";
}
};
//根据B策略继承虚基类,实现具体的策略逻辑;
class Context{
private:
unique_ptr<Strategy> strategy_;
public:
explicit Context(std::unique_ptr<Strategy>&& strategy){
strategy_ = std::move(strategy);
}
void executeStrategy() const{
if(strategy_){
strategy_->execute();
}
else{
cout<<"no strategy set\n";
}
}
};
//定义上下文类,以策略类为成员,其中具体的策略实现函数即当前成员策略的实现函数;
int main(){
Context context(std::make_unique<ConcreteStrategyA>());
context.executeStrategy();
//以策略A为成员,构造上下文,则上下文对象中策略的实现方式就是策略A的方式;
context.setStrategy(std::make_unique<ConcreteStrategyB>());
context.executeStrategy();
//以策略B为成员,构造上下文,则上下文对象中策略的实现方式就是策略A的方式;
return 0;
}