状态图已在编程中用于描述系统可能处于几十年的各种可能状态。它们还可以快速显示哪些状态相互引导,以及哪些触发状态更改。 当然,您可以将这些图用于具有各种状态的任何系统或过程-图书馆书籍,出版过程,甚至是针对孩子的惩罚和奖励状态。它们与流程图非常相似,但是UML具有专门用于状态图的表示法,它们也称为状态机或状态图。

UML表示法中的状态图

状态图与活动或交互概述图之间的最大区别在于,状态图不(必需)显示顺序。他们只是表示什么状态是可能和他们的进入和退出点,而不是这些状态被输入。 状态图可能非常复杂–您可以嵌套状态图,在状态之前放置防护(true / false),添加由状态更改触发的动作,甚至推迟事件在以后处理。这些图可能会占用大量文字,并且条件通常是针对一种特定的编程语言编写的。这可能会使图表看起来很复杂,但由于误解的可能性较小,因此也可以使编程(和测试)更快。
在draw.io中打开此图

UML状态图的组件

UML状态图使用您在UML活动图中可能已经看到的符号  。
  • 起始状态:实心圆。
  • 结束状态:带有圆环的实心圆。
  • 状态:带有圆角的矩形,带有动作的名称。
  • 过渡:带有标签的连接器箭头,用于指示该过渡的触发器(如果有)。
  • 具有内部活动的状态:具有水平线的状态,其行为在下半部分列出。
  • 组合状态:在下半部分带有水平线和嵌套状态图(或链接到另一个draw.io页)的状态。
  • 警卫或条件:钻石。
  • 音叉:较粗的线,其中有一个过渡输入,而有两个或多个输出。
  • 联接:一条较粗的线,有多个过渡输入,只有一个过渡。
提示: UML 2状态图使用透明的黑色/白色形状,而UML 1具有黄色轮廓和红色轮廓。我个人觉得UML 2更容易阅读。

启用UML形状库

在draw.io中,活动图所需的所有形状都在UML形状库中。单击   左侧面板底部的More Shapes ...,然后启用  UML  shape库并单击  Apply查找形状的速度更快:即使您没有显示UML库,也可以在左侧面板中搜索“状态”,它会向您显示创建状态图所需的形状(以及与其他图表类型中的“状态”相关的其他少数)。

货叉/接头和护板之间的区别

警卫代表基于条件的决策,类似于流程图中的决策。在下面的简单示例中,警卫人员检查是否已支付费用。如果是,它将继续到下一个状态。如果否,它将中止整个注册。 分支和联接发生在程序中同时执行两个或更多并行操作的地方-并发状态。如果有一个分叉,将有一个相应的联接,不同的“线程”将在该联接上进行同步。在下面的简单示例中,为本科生和研究生都分配了学生ID(大学管理),该ID与分配研究生指导员(教师管理)同时发生。
在draw.io中打开此图

习惯跟踪器示例的UML状态图

继续与先前的UML图帖子中使用的示例相同,我为用户登录到Habit Tracker时创建了一个状态图。您可以确定它类似于活动图(在状态图之后显示)。 因为此示例很简单,并且不包含任何并行操作或状态,所以使用两种类型的图都没有意义。实际上,大多数软件都是高度复杂的,有时除了(或代替活动图)还需要状态图。
习惯追踪器示例的状态图–  在draw.io中打开该图
习惯追踪器示例的活动图– 查看博客文章

draw.io中的UML图

除了状态图,您还可以使用draw.io轻松创建所有其他UML图类型:
  • 用例图
  • 活动图
  • 类图
  • 顺序图
  • 互动概述图
您是否喜欢使用UML图类型,但是我们还没有演示?让我们在Twitter上知道!