状态机:choice 与 fork

状态机:choice 与 fork

puml.online

简介 / Introduction

状态机(State Machine)常用于描述对象在其生命周期内的状态流转。除了普通的状态节点,还依赖两种重要的伪状态(Pseudostate)

  • choice — 条件分支,类似于 if/else,根据守卫条件选择下一个状态。
  • fork — 并行分支,同时从一点分叉出多个并发执行路径。

本文用同一个业务场景(订单处理)分别演示 PlantUML 与 Mermaid 的写法,并做横向对比。

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
@startuml
hide empty description

state "新订单" as New
state "已支付" as Paid
state "已发货" as Shipped
state "已签收" as Received
state "已取消" as Cancelled
state "退款中" as Refunding

[*] --> New
New --> Paid : paymentOk
New --> Cancelled : paymentFail
Paid --> Shipped : ship
Paid --> Refunding : refundRequest

state fork_state <<fork>>
Paid --> fork_state
fork_state --> Shipped
fork_state --> Refunding

state join_state <<join>>
Shipped --> join_state
Refunding --> join_state
join_state --> Received

Received --> [*]
Cancelled --> [*]
@enduml

PlantUML 使用 <<fork>><<join>> 关键字在状态图上标注伪状态,fork 之后多个箭头并行发出。

Mermaid 版

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
stateDiagram-v2
[*] --> New
New --> Paid : paymentOk
New --> Cancelled : paymentFail
Paid --> Shipped : ship
Paid --> Refunding : refundRequest

Paid --> Fork : ship
Fork --> Shipped
Fork --> Refunding

Shipped --> Received
Refunding --> Received
Received --> [*]
Cancelled --> [*]

Mermaid 使用 ForkJoin 关键字作为特殊状态节点,实现与 PlantUML 相同的效果。

对比 / Side-by-side

特性 PlantUML Mermaid
分支伪状态 state X <<choice>> X --> [*] : guard(内联守卫)
fork 语法 <<fork>> + <<join>> Fork / Join 节点
并行箭头 多个 --> Target 从 fork 发出 Fork 节点分出多条路径
语法风格 类图/活动图风格 YAML 风格简洁语法

小结 / Wrap-up

choicefork 是状态机建模的核心伪状态。PlantUML 通过 <<choice>><<fork>><<join>> 标注实现,语义清晰但语法略繁;Mermaid 用内置的 Fork/Join 节点实现,语法更简洁但不支持显式 choice 伪状态,守卫直接写在转移线上。选择哪个工具取决于项目对语义精确度和语法简洁性的取舍。

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