状态模式可以将状态和行动进行捆绑,并移出类外去实现对应关系。对象的状态不再是类内的属性值,而是一个指向状态对象的引用或指针,改变状态只是改变引用或指针的指向。对于新添加的状态和状态行为的改变不会对针对的类以及原有的状态于行为产生影响。
以下代码定义了状态接口及2个状态子类和他们各自的行为。
#include <iostream>
using namespace std;
class State
{
public:
virtual void Handle() = 0;
};
class ConcreteStateA:public State
{
public:
void Handle()
{
cout<<__PRETTY_FUNCTION__<<endl;
}
};
class ConcreteStateB:public State
{
public:
void Handle()
{
cout<<__PRETTY_FUNCTION__<<endl;
}
};
以下代码定义了一个在不同状态下有不同行为的类。
class Context
{
private:
State* m_pState;
public:
Context(State* state):m_pState(state){}
void SetState(State* state)
{
m_pState = state;
}
void Request()
{
m_pState->Handle();
}
};
以下代码演示了状态模式。首先生成2个状态对象,然后对目标类设置状态,并测试行为。
int main(void){
State* stateA = new ConcreteStateA();
State* stateB = new ConcreteStateA();
Context context(stateA);
context.Request();
context.SetState(stateB);
context.Request();
delete stateA;
delete stateB;
return 0;
}
输出
virtual void ConcreteStateA::Handle()
virtual void ConcreteStateA::Handle()