一、代码
#include <iostream>
using namespace std;
class Context;
class State {
public:
virtual void handle(Context* pContext) = 0;
virtual void myState() = 0;
};
class ConcreteStateA : public State {
public:
void handle(Context* pContext);
void myState() { cout << "ConcreteStateA" << endl; }
};
class ConcreteStateB : public State {
public:
void handle(Context* pContext);
void myState() { cout << "ConcreteStateB" << endl; }
};
class ConcreteStateC : public State {
public:
void handle(Context* pContext);
void myState() { cout << "ConcreteStateA" << endl; }
};
class Context {
public:
Context(State* pState) :_State(pState) {};
void Request() { _State->myState(); }
void ChangeState(State* pState) { _State = pState; };
private:
State* _State;
};
void ConcreteStateA::handle(Context* pContext) {
cout << "ConcreteStateA" << endl;
pContext->ChangeState(new ConcreteStateB());
}
void ConcreteStateB::handle(Context* pContext) {
cout << "ConcreteStateB" << endl;
pContext->ChangeState(new ConcreteStateC());
}
void ConcreteStateC::handle(Context* pContext) {
cout << "ConcreteStateC" << endl;
pContext->ChangeState(new ConcreteStateA());
}
int main() {
State* stA = new ConcreteStateA();
Context* con = new Context(stA);
stA->handle(con);
con->Request();
}
二、具体解释
状态模式是策略模式的变体,把状态State抽象出来了,然后把状态对应的动作抽象出来为Context类。