策略模式主要用来使用一系列的算法,或者对一个问题不同实现方式的情况。他方便使用和扩展,统一使用一个接口。
Strategy:方法基类,具体算法主要由其子类去实现
StrategyOne,StratgyTwo:具体方法类,主要实现了DoSomething()方法。
Client: 控制类,主要用来执行算法。
下面是使用场景:
小明要去北京,有坐飞机和做高铁两种选择。
代码
class Strategy
{
virtual void DoSomething() = 0;
virtual ~Strategy();
};
class StrategyOne : public Strategy
{
void DoSomething()
{
std::cout<<"坐飞机去北京!!!"<<std::endl;
}
};
class StrategyTwo : public Strategy
{
void DoSomething()
{
std::cout<<"坐火车去北京!!!"<<std::endl;
}
};
class Client
{
private:
shared_ptr<Strategy> m_pstrategy;
public:
Client(shared_ptr<Strategy> pStrategy)
{
this->m_pstrategy = pStrategy;
}
void ExecStrategy()
{
m_pstrategy.get()->DoSomething();
}
}
测试代码
int main()
{
std::shared_ptr<Client> pClientTwo = std::make_shared<Client>(std::make_shared<StrategyTwo>());
pClientTwo.get()->ExecStrategy();
std::shared_ptr<Client> pClientOne = std::make_shared<Client>(std::make_shared<pClientOne>());
pClientOne.get()->ExecStrategy();
}
该模式下如果在需要增加一种方式去北京比如自驾, 只需要继承Strategy,重写一个方法即可,调用方式不变。程序容易理解且容易扩展。