| 方式 | 優點 | 缺點 | 適用 |
| Switch-Case | 簡單直觀、適合小型 FSM | 狀態多時代碼膨脹、難維護 | <10 狀態 |
| 狀態表 (查表法) | 數據驅動、易擴展、表驅動測試 | 動作邏輯分離、複雜動作需回調 | 中型、協議解析 |
| 狀態模式 | 每狀態一類、封裝轉移/動作、OCP | 類別爆炸、間接呼叫開銷 | 大型、遊戲 AI |
| 嵌入式框架 | 代碼生成、圖形化建模、驗證 | 學習曲線、依賴工具鏈 | 安全關鍵系統 |
C 語言查表法範例
typedef enum {IDLE, CONN, AUTH, ESTAB} State;
typedef enum {EV_SYN, EV_ACK, EV_DATA, EV_FIN, EV_TIMEOUT} Event;
typedef struct { State next; void (*action)(void); } Transition;
Transition table[4][5] = {
[IDLE] = {{CONN, send_syn}, {IDLE, NULL}, ...},
[CONN] = {{IDLE, reset}, {AUTH, send_auth}, ...},
// ...
};
State current = IDLE;
void handle_event(Event e) {
Transition tr = table[current][e];
if (tr.action) tr.action();
current = tr.next;
}
設計原則
- 單一職責:每狀態只處理相關事件。
- 完整覆蓋:所有 (State, Event) 組合必有定義 (含錯誤轉移)。
- 冪等性:重複事件不應導致異常副作用。
- 可觀測性:記錄狀態變遷日誌,便於除錯。
應用場景
- 網路協議 (TCP 狀態機、HTTP 解析器、MQTT)。
- 詞法/語法分析器 (正則表達式引擎本質是 FSM)。
- 遊戲角色行為 (巡邏→追擊→攻擊→逃跑)。
- 嵌入式控制 (電梯、自動販賣機、交通燈)。
- 業務流程引擎 (訂單狀態:建立→付款→發貨→完成/退款)。
參考資源
- 上一篇文章: CUDA 共享記憶體深度解析:Bank Conflict、同步與效能優化實戰
- 下一篇文章: CSAPP Attack Lab 緩衝區溢出完整攻略:從 Smoke 到 Nitroglycerin
Copyright ©
程式碼之家 All Rights Reserved