状态机:复合状态与历史
简介 / Introduction
状态机(State Machine)广泛用于描述对象生命周期、协议状态流转。复合状态(Composite State)将多个子状态打包为一个高层状态,简化大图;历史状态(History State)记录退出复合状态前的最近子状态,支持”从哪里中断就从哪里恢复”。本文用同一业务场景(登录流程)分别演示 PlantUML 与 Mermaid 的语法,并做对照。
PlantUML 版
PlantUML 支持完整的复合状态与深/浅历史状态:
1 | @startuml |
PlantUML 要点:
state <Name> { ... }定义复合状态,内部可放任意子状态与分支。[*]在复合状态内部表示该复合状态的默认入口子状态。H <<History>>为浅历史状态,只记录一层;H* <<DeepHistory>>为深历史,可跨多层恢复。<<History>>/<<DeepHistory>>是立体 sterotype,需配合skinparam state BackgroundColor着色。
Mermaid 版
Mermaid 不支持 复合状态与历史状态。Mermaid stateDiagram 仅支持单层正交区域(使用 -- 分隔),但没有嵌套 state 块,也没有 H / H* 历史标记。以下是等价的单层表示,无法表达”恢复至上一次子状态”语义:
1 | stateDiagram-v2 |
若业务必须用到复合/历史状态,建议仍在 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 进行许可。