UML 里有不少图都能描述系统行为,但一旦问题落到“对象会经历哪些状态、在什么条件下切换、哪些事件会触发变化”,状态图通常是最直接的表达方式。下面按概念、适用场景、绘制方法和核心元素四个层次梳理 UML 状态图,读完之后你可以判断它适不适合当前建模任务,也能避开初始状态、转换条件和终止状态这些常见理解误区。
什么是 UML 状态图
UML 状态图用于描述对象具有的各种状态、状态之间的转换过程,以及触发状态转换的事件和条件。它本质上描述的是一个状态机:对象在不同时间点处于不同状态,并根据外部或内部事件作出响应。

从组成上看,状态机通常由五部分构成:
- 状态:对象在其生命周期中的一种状况。在某个状态中的对象,会满足特定条件、执行某些动作,或者等待某些事件。
- 转换:两个状态之间的关系,表示对象在特定事件触发且满足条件时,从一个状态进入另一个状态。
- 事件:对状态机有意义的事情,例如消息接收、对象创建或销毁、错误发生、时间流逝等。
- 活动:状态机中进行的非原子操作。
- 动作:可执行的原子操作,执行过程中不会被其他消息中断,直到完成并引起状态变化或返回结果。
可以把状态图理解为“对象生命周期的动态视图”。它关注的不是类之间的结构关系,而是一个实体在运行过程中如何随着事件变化而改变行为。
状态图主要解决什么问题
状态图最适合表达响应式系统中的动态行为。只要一个对象存在明确可区分的状态,并且其行为会因为当前状态不同而变化,状态图就有实际价值。
它的主要作用包括:
- 模拟系统的动态环节,而不是只描述静态结构。
- 反映系统、子系统或对象的生命周期。
- 描述对象在生命周期内可能经历的不同状态。
- 定义一个对象的状态机模型,说明行为如何随状态改变。
实际建模时,状态图还有两个很重要的价值。第一,它能把事件发生的合法顺序画清楚,减少大段文字说明;第二,它能把限制条件直接绑定在转换上,帮助开发者在实现时避免非法事件进入系统。
例如,在网上销售系统里,用户没有进入登录状态之前不允许购买商品;又比如,飞机起飞前半小时不允许继续售票。这类“只有在某个状态下,某个操作才合法”的规则,用状态图表达通常比流程描述更直观。
画 UML 状态图前,先确认这三件事
状态图不是从图形开始画,而是先做分析。绘制之前,至少要先识别出以下三项:

- 识别对象:先明确要分析的是哪个对象、子系统或业务实体。
- 识别状态:梳理这个对象在生命周期内有哪些稳定且可区分的状态。
- 识别事件:找出哪些内部或外部事件会触发状态变化。
从表示方式看,状态图主要由两类元素组成:
- 表示状态的节点;
- 表示状态切换关系的带箭头连线。
也就是说,状态图表达的核心逻辑并不复杂:对象先处于某个状态,接收到事件后,如果满足相应条件,就沿着转换箭头进入下一个状态。完整的状态图通常还会包含初始状态、终止状态以及判定分支等要素。
状态图的核心元素怎么理解
1. 状态
状态用于对实体在其生命周期中的各种状况进行建模,一个实体总是在有限的一段时间内保持某个状态。图形上,状态通常用圆角矩形表示。

一个状态的描述通常可以包含以下内容:
- 状态名:状态的名字,通常用字符串表示。名称在当前状态图上下文中应当唯一。
- 入口动作:进入状态时执行的动作。
- 出口动作:退出状态时执行的动作。
- 内部转换:不导致状态改变的转换,但可能触发活动或动作。
- 嵌套状态:状态可以继续细分为子状态。
从结构上看,状态可以分为两类:
- 简单状态(Simple State):语义上不可再分解,不包含其他状态。
- 组成状态(Composite State):内部包含子状态,适合表达更复杂的阶段性行为。
2. 转换
转换表示对象如何从一个状态切换到另一个状态。图形上,转换用带箭头的直线表示,一端连接源状态,箭头指向目标状态。
一条转换上可以附带多种信息,例如事件、监护条件和动作。如果转换线上没有标注触发事件,通常表示这是一条自动进行的转换。
理解转换时,通常要分清五个概念:
- 状态源(Source State):转换被激活前,对象所处的状态。
- 目标状态(Event State):转换完成后,对象进入的状态。
- 事件触发器(Event Trigger):引起转换的事件。事件发生在某个时间点,而不是持续过程。
- 监护条件(Guard Condition):一个布尔表达式。只有表达式为真,转换才会被激活;为假时,转换不发生,接收到的触发事件会丢失。
- 动作(Action):转换过程中执行的原子计算。
这里最容易混淆的是“事件”和“条件”:事件负责触发,条件负责判断能不能通过,动作则表示切换过程中要执行什么。
3. 初始状态
任何状态图都应当有一个初始状态,它表示整个状态机的起点。初始状态属于伪状态,对象不会真正停留在这里,而是必须沿着一条输出转换立即离开。
关于初始状态,需要注意几条规则:
- 它通常通过一条无触发转换连接到第一个实际状态。
- 一般不带监护条件。
- 只能作为转换的源,不能作为转换的目标。
- 一个状态图中通常只设置一个初始状态。
- 图形表示为实心圆。
4. 终止状态
终止状态表示状态图的终点。与初始状态不同,终止状态可以有一个,也可以有多个。
它的主要特点是:
- 只能作为转换的目标,不能作为转换的源。
- 不再有任何形式的后续触发转换。
- 它的意义是表示某个状态机执行过程已经结束。
- 图形表示为带实心圆的空心圆。
5. 判定
当状态图中的流程需要根据条件分支时,可以使用判定。它与活动图中的判定含义相近,本质上都是根据监护条件的取值,决定接下来沿哪一条路径继续执行。
在 UML 中,判定一般用空心菱形表示。它特别适合表达“同一事件触发后,不同条件对应不同状态分支”的场景。
为什么状态图对设计和开发有帮助
状态图的价值,不只是“把状态画出来”,更重要的是把系统行为规则前置到设计阶段。
- 它能清晰描述状态之间的转换顺序,从而看清事件的执行顺序。
- 它能帮助开发者在编码时避免事件顺序错误。
- 它能把触发事件、监护条件和动作明确标在转换上,减少遗漏约束条件的风险。
- 它能通过判定更清楚地表达工作流分支。
例如,当一个班的人数少于 10 人时,需要与其他班合班上课;大于 10 人时,则单独上课。这样的规则如果只写成文字,容易在实现时被忽略;而放在状态图里,分支条件和去向会一目了然。
总的来说,一张简洁且完整的状态图,能够帮助设计者更系统地检查对象生命周期中的关键状态、转换规则与异常分支,尽量减少后续实现阶段的逻辑遗漏。













