策略模式與狀態(tài)模式看起來差不多醋闭,只是從概念上側(cè)重不同鲤看。策略模式封裝的是策略或算法镰绎,狀態(tài)模式封裝的是狀態(tài)脓斩,主要區(qū)別在于封裝對象的不同形式。
以下代碼定義了兩種算法策略類畴栖。
#include <iostream>
using namespace std;
class Strategy
{
public:
virtual ~Strategy(){}
virtual void AlgorithmInterface() = 0;
};
class ConcreteStrategyA:public Strategy
{
public:
void AlgorithmInterface()
{
cout<<__PRETTY_FUNCTION__<<endl;
}
};
class ConcreteStrategyB:public Strategy
{
public:
void AlgorithmInterface()
{
cout<<__PRETTY_FUNCTION__<<endl;
}
};
以下代碼實(shí)現(xiàn)了策略的使用者類随静。
class Context
{
private:
Strategy* m_pStrategy;
public:
Context(Strategy* strategy):m_pStrategy(strategy){}
void SetStrategy(Strategy* strategy)
{
m_pStrategy = strategy;
}
void ContextInterface()
{
m_pStrategy->AlgorithmInterface();
}
};
以下代碼演示了策略模式,通過對context對象切換策略,切換了其同一接口的算法實(shí)現(xiàn)燎猛。
int main(void){
Strategy* strategyA = new ConcreteStrategyA();
Strategy* strategyB = new ConcreteStrategyB();
Context context(strategyA);
context.ContextInterface();
context.SetStrategy(strategyB);
context.ContextInterface();
delete strategyA;
delete strategyB;
return 0;
}
輸出
virtual void ConcreteStrategyA::AlgorithmInterface()
virtual void ConcreteStrategyB::AlgorithmInterface()