当前位置:首页 > draw.io教程

绘制 UML 状态机图

drawio4年前 (2022-08-05)draw.io教程10

状态图或状态机图的概念早在 20 世纪中期就已出现,远早于 David Harel 将其修改为如今作为 UML 标准一部分的形式。

UML状态图(也称状态机图)是对流程图的补充:

  • 流程图或 UML 活动图中的每个节点都是流程中的一个动作。

  • 状态图中的每个节点都表示一个系统状态,连接线表示触发状态改变的因素。

记录系统状态以及触发其他状态的转换(过程)有助于定义和编程具有互连组件的复杂系统。状态图可用于清晰地记录故障状态及其恢复过程,以便在需要时追究责任或突出显示现有系统的问题。

使用状态图分析问题:在页面顶部的示例中,红色表示错误状态。您可以清楚地看到,当智能锁电池电量耗尽时,门会保持锁定状态,这表明存在问题。

启用 UML 2.5 形状库

点击“形状”面板底部的“更多形状” ,在“软件”部分启用 UML 2.5 形状库,然后点击“应用”

您也可以在“形状”面板的 “搜索形状”state字段中搜索来找到它们中的大多数。

UML状态图的组成部分

状态图由三种形状构成——状态、伪状态和转换。

各州

包含一个或多个区域的简单状态和复合状态,或者包含整个子状态(包含整个状态图)的复合状态。

状态形状有多种样式——您可以选择任何您喜欢的样式。如果您想定义系统处于该状态时发生的活动(行为),请使用更详细的状态形状。

复合状态可以在较高层级上显示,右下角的图标表示两个水平连接的状态。

将复合形状链接到图表页面

在高级复合状态形状上添加指向包含子状态图的另一个图表页面的链接。右键单击该形状,选择“编辑链接”,然后选择要链接到的图表页面,最后单击“应用”

了解如何使用多页图表

绘制区域

状态可以包含并发区域,也称为正交区域。这些区域用内部的虚线水平线或垂直线表示,表明多个状态机同时处于活动状态。

使用虚线连接器,并将其作为固定连接连接到状态形状 - 当形状轮廓变为绿色时,断开连接器。

将状态转换为容器

你还可以将状态转换为容器形状,并在其中绘制子状态图。这样做的好处是,当你移动容器状态时,子状态也会随之移动。

选择形状,然后打开格式面板“样式”选项卡中的“属性”部分。启用“容器”复选框。

伪状态

您可以在图中包含几个瞬态伪状态。

  • 初始状态为实心圆。

  • 入口点州地图侧面的一个空心圆圈。

  • 出口是一个圆圈,圆圈一侧画有十字。

  • 浅层历史记录是一个带有圆圈的图形H,用于表示进入该状态下最近活跃的子状态的入口点。然后执行进入该子状态的操作。

  • 深度历史记录是一个H*内部有圆的圆圈,用于表示最近一次回忆复合状态的活动配置的入口点——对每个记住的活动子状态执行入口操作。

  • 选项用菱形表示,就像流程图中一样。请使用通用形状库中的菱形形状

  • 分叉是一条实线,它将一个过渡区域分成两个或多个过渡区域。在描述具有多个区域的复合状态时,通常会隐含地(而不是画出来)表示分叉

  • 连接线是一个实心条,它有两个或多个输入源和一个输出源。

  • 连接是一个小的实心圆圈,可用于合并或拆分具有不同保护条件的过渡。

  • 最终状态一个实心圆位于一个大圆之内,表示包围区域已完成。

最常用的伪状态是初始状态和最终状态。

过渡

过渡状态是连接不同状态的桥梁。

连接器/转换线上的标签通常遵循以下格式trigger [guard conditions] /actions。触发器一般需要定义,但如果不需要,则可以省略保护条件和动作。

根据文本创建 UML 状态图

你可以使用 Mermaid 语法在文本中定义状态图,draw.io 将为你生成该图。

  1. 点击“排列”>“插入”>“高级”>“美人鱼”打开文本输入框。

  2. 在文本框中输入状态机的 Mermaid 描述,然后单击“应用”。图表编辑器会将其转换为画布上的 SVG 表示。双击此表示即可再次编辑 Mermaid。

例如,将上面复合状态“重新连接”的示例转换为美人鱼文本描述:

stateDiagram-v2
  [*] --> Active
  state Active {
    [*] --> Reconnecting
    Reconnecting --> EstablishingConnection
    EstablishingConnection --> Reconnecting : failed [no connection] /wait 5s then reconnect
    EstablishingConnection --> [*] : success [connection established]
  --
  [*] --> Listening
  Listening  --> VerifyingAccess : key presented [valid RFID code] /verify
  VerifyingAccess --> [*]
    state VerifyingAccess{
      [*] --> CheckingInternalRecords
      CheckingInternalRecords --> KeyAccessVerified : key allowed [valid key]
      KeyAccessVerified --> Unlocked : [valid key] /unlock
      Unlocked --> [*] : wait 5 seconds after door close [unlocked] /lock
      CheckingInternalRecords --> InvalidKey : not found [invalid key] /ignore
      InvalidKey --> [*] : /ignore
    }
  }

UML状态图示例 - 智能锁

以下状态和子状态图描述了一个智能锁系统,该系统依赖互联网连接来更新其记录(钥匙中嵌入了RFID标签)。在这种情况下,除非与服务器的连接中断,否则系统也会使用服务器上的记录。

通过分析这些图表,你能发现哪些问题?

在我们的图表查看器中打开此示例

智能锁的顶层 UML 状态机图示例