状态机:复合状态与历史

状态机:复合状态与历史

puml.online

简介 / Introduction

状态机(State Machine)广泛用于描述对象生命周期、协议状态流转。复合状态(Composite State)将多个子状态打包为一个高层状态,简化大图;历史状态(History State)记录退出复合状态前的最近子状态,支持”从哪里中断就从哪里恢复”。本文用同一业务场景(登录流程)分别演示 PlantUML 与 Mermaid 的语法,并做对照。

PlantUML 版

PlantUML 支持完整的复合状态与深/浅历史状态:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
@startuml
skinparam state {
BackgroundColor<<Composite>> #E3F2FD
BackgroundColor<<History>> #FFF9C4
BackgroundColor<<Final>> #FFCDD2
FontSize 13
}
title 登录状态机 — PlantUML 复合状态

[*] --> LOGGING

state LOGGING {
[*] --> IDLE
IDLE --> VERIFYING : 输入凭据\n点击登录
VERING --> PASSWORD_ERROR : 密码错误\n<max retries
PASSWORD_ERROR --> IDLE : 重试
VERIFYING --> MFA_REQUIRED : 需二次验证
MFA_REQUIRED --> MFA_CHALLENGE : 发送验证码
MFA_CHALLENGE --> MFA_OK : 验证通过
MFA_CHALLENGE --> MFA_FAIL : 超时/错误\n>max attempts
MFA_FAIL --> [*]

-- History track --
state "H" as H <<History>>
state "H*" as HSTAR <<DeepHistory>>
IDLE --> H : 退出
H --> IDLE : 恢复
HSTAR --> MFA_CHALLENGE : 深恢复
}

LOGGING --> AUTHENTICATED : MFA_OK\n或免 MFA\n直接验证通过
AUTHENTICATED --> LOGGING : 退出登录
AUTHENTICATED --> [*]

note right of LOGGING
H : 浅历史 — 恢复到最近子状态
H* : 深历史 — 递归恢复任意层级
end note
@enduml

PlantUML 要点:

  • state <Name> { ... } 定义复合状态,内部可放任意子状态与分支。
  • [*] 在复合状态内部表示该复合状态的默认入口子状态。
  • H <<History>> 为浅历史状态,只记录一层;H* <<DeepHistory>> 为深历史,可跨多层恢复。
  • <<History>> / <<DeepHistory>> 是立体 sterotype,需配合 skinparam state BackgroundColor 着色。

Mermaid 版

Mermaid 不支持 复合状态与历史状态。Mermaid stateDiagram 仅支持单层正交区域(使用 -- 分隔),但没有嵌套 state 块,也没有 H / H* 历史标记。以下是等价的单层表示,无法表达”恢复至上一次子状态”语义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
stateDiagram-v2
direction TB
[*] --> IDLE
IDLE --> VERIFYING : 输入凭据\n点击登录
VERIFYING --> PASSWORD_ERROR : 密码错误
PASSWORD_ERROR --> IDLE : 重试
VERIFYING --> MFA_REQUIRED : 需二次验证
MFA_REQUIRED --> MFA_CHALLENGE : 发送验证码
MFA_CHALLENGE --> MFA_OK : 验证通过
MFA_CHALLENGE --> MFA_FAIL : 超时/错误
MFA_FAIL --> [*]
MFA_OK --> AUTHENTICATED
AUTHENTICATED --> IDLE : 退出登录
AUTHENTICATED --> [*]

note right of MFA_CHALLENGE
Mermaid 无复合状态。
无历史状态,无法记忆
上次中断的子状态。
end note

若业务必须用到复合/历史状态,建议仍在 PlantUML 中绘制,Mermaid 目前(v11)不计划支持。

对比 / Side-by-side

特性 PlantUML Mermaid
复合状态(嵌套子状态) state X { ... } ❌ 不支持
浅历史状态 H <<History>> ❌ 不支持
深历史状态 H* <<DeepHistory>> ❌ 不支持
默认入口子状态 [*] 在复合块内 N/A
分支正交区域 -- 分隔 -- 分隔
状态着色 skinparam ✅ 完整支持 ⚠️ 仅全局 fill

小结 / Wrap-up

PlantUML 的状态机语法完整支持复合状态与历史状态,适合复杂协议、流程引擎等场景。Mermaid stateDiagram 定位轻量,走单层路线,若项目依赖”中断-恢复”语义,建议仍用 PlantUML。两者选型取决于状态复杂度——简单流转用 Mermaid 快速上手,层次丰富则 PlantUML 更胜一筹。

  • 标题: 状态机:复合状态与历史
  • 作者: puml.online
  • 创建于 : 2026-09-05 09:00:00
  • 更新于 : 2026-09-05 01:06:44
  • 链接: https://puml.online/blog/state-diagram-composite/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。