什麼是狀態圖?
一個狀態圖(通常稱為狀態機或狀態圖)是一種行為UML 圖,用來模擬單一系統物件、商業實體或執行時期流程的生命周期。作為統一模型語言(UML)規格的基本組成部分,這種特定的UML 圖類型說明物件從初始建立到最終銷毀期間可能處於的各種狀態,以及觸發狀態轉換的特定事件或條件。
無論您是在記錄 WebSocket 連線的複雜連線旗標、電子商務結帳模型的訂單處理步驟,還是自主硬體系統的行為,UML 狀態機都能為軟體開發人員與軟體架構師提供複雜反應式邏輯的清晰、明確藍圖。透過VPasCode,您可立即撰寫複雜的狀態轉換,無需與格線對齊或重疊的邊界箭頭搏鬥。
核心語法指南:元素與構造
要撰寫高品質且符合標準的狀態圖佈局,您需要理解起始點與終止點、狀態定義、事件轉換、巢狀複合狀態以及條件選擇點。
1. 初始狀態與終止狀態
每個狀態機都必須有一個進入點,並可選擇性地設置一個終止點。在 PlantUML 語法中,這些邊界元素以乾淨的星號符號包裝來表示:
[*] --> 狀態名稱(定義初始起始狀態)狀態名稱 --> [*](定義終止結束狀態)
2. 定義狀態與事件轉換
只要狀態之間以方向性箭頭(-->)連結,狀態就會自動宣告。要為轉換增加上下文,請在後方附加冒號(:),再接上觸發狀態變化的特定事件、API 觸發或方法呼叫:
[*] --> 離線
離線 --> 連線中 : "connect()"
連線中 --> 已連線 : "auth_success" 
3. 組合/嵌套狀態
複雜的應用程式通常具有包含自身嵌套子狀態的單獨狀態。您可以使用「state」關鍵字,後面加上開括號:
state ActiveWorkspace {
[*] --> Idle
Idle --> Typing : "keypress"
Typing --> Idle : "timeout"
} 
4. 選擇點(條件分支)
當事件發生時,系統通常需要先評估內部資料旗標,才能決定下一個狀態目的地。要繪製標準的 UML 選擇菱形,請使用「<<choice>>」樣式標記:
state check_payment <<choice>>
OrderPlaced --> check_payment : "process()"
check_payment --> Paid : [balance >= total]
check_payment --> Failed : [balance < total] 
建立清晰狀態圖的最佳實務
- 善用狀態描述:您可以使用冒號包裝直接在狀態節點內附加明確的操作細節、進入鉤子或退出函數(例如,
StateName : entry / logTimestamp()). - 保持狀態名稱簡潔:為您的內部狀態變數代碼使用駝峰式大小寫或底線式大小寫(例如,
PaymentProcessing),如果需要為它們附加長串易讀的標籤,請使用引號。 - 管理向量路由方向:如果您的多層級生命週期地圖在垂直方向上變得雜亂,請在連接箭頭中插入內聯空間規則(例如,
-right->或-down->) 以平衡佈局密度。
現實世界中的 PlantUML 狀態圖範例
範例 1:物聯網裝置網路生命週期(複合狀態與選擇)
此範本追蹤物聯網感測器模組的連線行為狀態迴圈,展現複雜的結構嵌套區塊與條件評估選擇針點。
@startuml
[*] --> 離線
離線 --> 連線中 : "開機"
狀態 連線中 {
[*] --> 初始化
初始化 --> 解析DNS : "硬體準備就緒"
解析DNS --> 發送握手 : "取得IP位址"
}
狀態 驗證檢查 <<選擇>>
連線中 --> 驗證檢查 : "接收伺服器挑戰"
驗證檢查 --> 上線 : [憑證有效]
驗證檢查 --> 離線 : [憑證過期] : "閃爍紅燈"
狀態 上線 {
[*] --> 空閒
空閒 --> 傳輸資料 : "計時器觸發"
傳輸資料 --> 空閒 : "收到確認訊號"
空閒 --> 節能模式 : "電量不足偵測到"
}
上線 --> 離線 : "連線中斷"
@enduml 
語法解析: 此圖明確區分個別的操作迴圈。當硬體轉換至複合連線中 包裝狀態時,會追蹤如 DNS 解析等局部子狀態,直到達到驗證檢查 選擇菱形。方括號([憑證有效])代表標準的 UML 保護條件。
範例 2:電子商務訂單履行狀態機(並行子狀態)
此進階企業藍圖模擬多執行緒訂單系統,展示正交並行行為(同時處理運送包裹與帳單記錄)使用分隔線(--).
@startuml
[*] --> 購物車
購物車 --> 訂單已提交 : "結帳點擊"
訂單已提交 --> 處理付款 : "授權資金"
狀態 處理付款 {
[*] --> 聯繫銀行
聯繫銀行 --> 結算完成 : "成功扣款"
}
處理付款 --> 訂單已確認 : "付款完成"
狀態 訂單已確認 {
[*] --> 物流處理
狀態 物流處理 {
[*] --> 挑選商品
挑選商品 --> 裝箱 : "庫存已鎖定"
裝箱 --> 送達中 : "標籤已列印"
}
--
[*] --> 帳單記錄
狀態 帳單記錄 {
[*] --> 編製發票
編製發票 --> 發送發票 : "PDF 已產生"
}
}
訂單已確認 --> 訂單已歸檔 : "送達確認"
訂單已歸檔 --> [*]
@enduml 
語法解析: 在訂單已確認 複合結構中,雙連字符分隔符(--)作為正交分隔符。這指示 PlantUML 將圖表分割為兩個並行執行的狀態:左側的實體物流管道,以及右側的企業帳單更新。