對象行為隨內部狀態改變而改變。傳統用大量 if-else 判斷狀態導致代碼臃腫、難維護、難擴展。狀態模式將每種狀態封裝為獨立類,狀態轉換由狀態類內部控制。
Handle(Context*)。_state,委托請求給狀態對象,提供 ChangeState() 供狀態類調用。四種狀態:無錢、有錢、出糖、售罄。操作:投幣、退幣、轉動曲柄、發糖。每種狀態下操作行為不同(如無錢狀態下投幣轉為有錢,轉動曲柄無效)。
class Context; // 前向聲明
class State {
public:
virtual void Handle(Context* pContext) = 0;
virtual ~State() {}
protected:
State() {}
};
class ConcreteStateA : public State {
public:
ConcreteStateA() {}
~ConcreteStateA() {}
void Handle(Context* pContext) override { /* 處理邏輯,可調用 pContext->ChangeState(new ConcreteStateB()) */ }
};
class ConcreteStateB : public State { /* 類似 */ };
class ConcreteStateC : public State { /* 類似 */ };
class Context {
public:
Context(State* pState) : _state(pState) {}
~Context() { delete _state; }
void Request() { _state->Handle(this); }
void ChangeState(State* pState) { delete _state; _state = pState; }
private:
State* _state;
};