什么是状态图?
一个状态图(通常称为状态机或状态图)是一种行为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 将图表分为两个并行执行的并发状态:左侧的物理物流流程,以及右侧的企业账单更新。