首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 設計模式:狀態模式詳解與糖果機例子框架

     編輯:關於C++

模式動機

對象行為隨內部狀態改變而改變。傳統用大量 if-else 判斷狀態導致代碼臃腫、難維護、難擴展。狀態模式將每種狀態封裝為獨立類,狀態轉換由狀態類內部控制。

核心角色

  • State:抽象狀態類,定義處理請求的接口 Handle(Context*)。
  • ConcreteState:具體狀態類,實現特定狀態下的行為及轉換邏輯。
  • 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;
};

優勢

  • 消除巨大的條件分支,每個狀態類封裝自身邏輯。
  • 狀態轉換顯式化,易於理解和維護。
  • 易於增加新狀態(新增 ConcreteState 類),符合開閉原則。
  • 可將狀態對象設計為單例(共享),節省內存。

適用場景

  • 對象行為受狀態影響大,且狀態數較多、轉換頻繁。
  • 代碼中存在大量依賴狀態的條件語句。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved