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

C++ 設計模式:狀態模式深度解析與狀態轉換實作

     編輯:關於C語言

狀態模式允許物件在內部狀態改變時改變其行為,物件彷彿修改了自己的類別。本文對比傳統 switch-case 寫法,詳解狀態模式結構、協作流程、適用場景與完整程式碼實作。

傳統寫法痛點

typedef enum { state, state1, state2 } State;
void Action(State actionState) {
    if (actionState == state) { /* ... */ }
    else if (actionState == state1) { /* ... */ }
    else if (actionState == state2) { /* ... */ }
}

新增狀態需修改原函數,違反開閉原則,測試困難,分支膨脹難以維護。

狀態模式結構

  • Context:定義客戶介面,持有當前狀態物件參考。
  • State:定義狀態行為介面。
  • ConcreteState:各具體狀態類別實作特定行為。

UML 類別圖

狀態模式 UML

協作流程

  1. Context 將請求委派給當前 ConcreteState 處理。
  2. State 可透過 Context 參數存取上下文資料。
  3. 客戶端僅與 Context 互動,配置好初始狀態後無需直接操作 State。

適用場景

  1. 物件行為取決於狀態,且需在執行期根據狀態動態改變行為。
  2. 操作包含龐大多分支條件語句,分支依賴物件狀態(常用枚舉表示)。

完整程式碼實作

#include <iostream>
using namespace std;

class Context;  // 前向宣告

class State {
public:
    virtual void Handle(Context *pContext) = 0;
    virtual ~State() {}
};

class ConcreteStateA : public State {
public:
    void Handle(Context *pContext) override {
        cout << "I am ConcreteStateA." << endl;
    }
};

class ConcreteStateB : public State {
public:
    void Handle(Context *pContext) override {
        cout << "I am ConcreteStateB." << endl;
    }
};

class Context {
    State *m_pState;
public:
    Context(State *pState) : m_pState(pState) {}
    void Request() { if (m_pState) m_pState->Handle(this); }
    void ChangeState(State *pState) { m_pState = pState; }
    ~Context() { delete m_pState; }
};

int main() {
    State *pStateA = new ConcreteStateA();
    State *pStateB = new ConcreteStateB();
    Context *pContext = new Context(pStateA);
    pContext->Request();          // 輸出: I am ConcreteStateA.
    pContext->ChangeState(pStateB);
    pContext->Request();          // 輸出: I am ConcreteStateB.
    delete pContext;
}

狀態模式 vs 策略模式

維度狀態模式策略模式
核心關注狀態轉換與狀態相關行為同一動作的不同演算法實作
狀態/策略持有者Context 內部管理狀態轉換客戶端決定使用哪個策略
典型場景訂單流程、遊戲角色狀態、TCP 連線狀態排序演算法、支付方式、壓縮格式

總結

狀態模式將條件分支分散到各狀態類別,消除巨大 switch-case,使狀態轉換明確、易擴展、易測試。適用於多狀態、狀態轉換複雜的系統核心邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved