需要令某个模块(上下文)执行一个功能,但是该模块可以配置不同的算法,在不同的算法下,执行的结果也不同。
这里,算法就是策略。策略模式就是在运行时可以进行策略的更改,从而影响到执行的结果。
1. 定义策略类基类及派生类
策略类基类定义了策略类的标准接口。
策略类派生类实现了策略类的标准接口。
策略类提供的标准接口一般是某个与Context无关的独立功能模块,比如算法。
虽然用户会与策略类进行交互(创建策略类对象),但是用户不会调用策略类的标准接口。
//策略类基类
class Strategy
{
public:
virtual void algrithmInterface() = 0;
protected:
Strategy();
private:
};
//策略类派生类
class ConcreteStrategyA : public Strategy
{
public:
virtual void algrithmInterface()
{
cout << "ConcreteStrategyA::algrithmInterface" << endl;
};
};
//策略类派生类
class ConcreteStrategyB : public Strategy
{
public:
virtual void algrithmInterface()
{
cout << "ConcreteStrategyB::algrithmInterface" << endl;
};
};
2. 定义上下文
上下文类为用户提供了一个标准的执行函数接口,该接口是由用户调用的。
上下文类内嵌了策略类对象,并会在执行函数中对策略类的标准接口进行调用。
//上下文
class Context
{
public:
Context(Strategy* strategy)
{
this->_strategy = strategy;
};
void setStrategy(Strategy* strategy)
{
this->_strategy = strategy;
}
void doAction()
{
this->_strategy->algrithmInterface();
};
private:
Strategy* _strategy;
};
3. 用户使用
用户与上下文对象进行交互。用户所需要的功能实现都是通过调用上下文对象的标准接口来实现的。
但是用户也必须决定使用哪种策略,并将策略配置给上下文对象。
void main()
{
//策略A与B可替换
Strategy* pStrategyA = new ConcreteStrategyA();
Context* pContext = new Context(pStrategyA);
pContext->doAction();
Strategy* pStrategyB = new ConcreteStrategyB();
pContext->setStrategy(pStrategyB);
pContext->doAction();
}