狀態模式(State):當一個對象的內在狀態改變時允許改變其行爲,這個對象看起來像是改變了其類。
狀態模式主要解決的是當控制一個對象狀態轉換的條件表達式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系列類當中,可以把複雜的判斷邏輯化。
模式實現:
class Context;
class State{
public:
virtual void Handle(Context *pContext) = 0;
};
class ConcreteStateA: public State{
public:
virtual void Handle(Context *pContext){
std::cout << "I'm concretestateA.\n";
}
};
class ConcreteStateB: public State{
public:
virtual void Handle(Context *pContext){
std::cout << "I'm concretestateB.\n";
}
};
class Context{
public:
Context(State *state):pState(state){}
void Request(){
if(pState){
pState->Handle(this);
}
}
void ChangeState(State *pstate){
pState = pstate;
}
private:
State *pState;
};
客戶端
int main(){
State *pState = new ConcreteStateA();
Context *context = new Context(pState);
context->Request(); //Output: I'm concretestateA.
State *pState2 = new ConcreteStateB();
context->ChangeState(pState2);
context->Request(); //Output: I'm concretestateB.
if(pState){
delete pState;
pState = NULL;
}
if(pState2){
delete pState2;
pState2 = NULL;
}
if(context){
delete context;
context = NULL;
}
return 0;
}