状态图用于表示系统或系统的一部分在有限时间实例中的状况。这是一个行为图,它使用有限状态转换来表示行为。状态图也称为状态机和状态图。这些术语通常可以互换使用。简单地说,状态图用于模拟类响应时间和不断变化的外部刺激的动态行为。我们可以说每个类都有一个状态,但我们不会使用状态图对每个类进行建模。我们更喜欢对具有三个或更多状态的状态进行建模。
状态图的用途 –
- 我们用它来陈述导致状态变化的事件(我们不显示是什么进程导致这些事件)。
- 我们用它来建模 系统的动态行为。
- 了解对象/类对内部或外部刺激的反应。
首先让我们了解什么是行为图?UML 中有两种类型的图:
1. 结构图 –用于对系统的静态结构进行建模,例如类图、包图、对象图、部署图等。
2. 行为图 –用于对系统中随时间推移的动态变化进行建模。它们用于对系统的功能进行建模和构造。因此,行为图只是使用用例图、交互图、活动图和状态图来指导我们完成系统的功能。
状态图和流程图之间的区别 –
状态图的基本目的是描述类状态的各种变化,而不是导致更改的进程或命令。但是,另一方面,流程图描绘了在执行时更改类或类对象的状态的进程或命令。
![](../../images/2023061341.png)
图 – 用于用户验证的状态图
上面的状态图显示了特定系统的验证子系统或类存在的不同状态。
状态图的基本组成部分 –
1. 初始状态 –我们使用黑色填充的圆圈表示系统或类的初始状态。 ![](../../images/2023061342.png)
图 – 初始状态表示法
2. 过渡–我们使用实心箭头来表示从一种状态到另一种状态的控制权的转换或变化。箭头标有导致状态更改的事件。 ![](../../images/2023061343.png)
图 – 过渡
3. 状态–我们使用圆角矩形来表示状态。状态表示类的对象在某个时刻的条件或情况。
![](../../images/2023061344.png)
图 – 状态表示法
4. 分叉–我们使用圆角实心矩形条来表示 Fork 符号,其中包含来自父状态的传入箭头和朝向新创建状态的传出箭头。我们使用
fork 表示法来表示拆分为两个或多个并发状态的状态。
![](../../images/2023061345.png)
图 – 使用分叉符号的图表
5. 加入–我们使用圆角实心矩形条来表示连接符号,其中包含来自连接状态的传入箭头和朝向共同目标状态的传出箭头。当两个或多个状态在一个或多个事件的发生时同时收敛为一个时,我们使用连接表示法。
![](../../images/2023061346.png)
图 – 使用连接符号的图表
6. 自我转换–我们使用一个指向状态本身的实心箭头来表示自我转换。在某些情况下,对象的状态不会在事件发生时更改。我们使用自我转换来表示这种情况。
![](../../images/2023061347.png)
图 – 自转换符号
7. 复合状态 –我们也使用圆角矩形来表示复合状态。我们使用复合状态表示具有内部活动的状态。
![](../../images/2023061348.png)
图 – 具有内部活动的状态
8. 最终状态 –我们使用圆圈符号中的填充圆来表示状态机图中的最终状态。
![](../../images/2023061349.png)
图 – 最终状态表示法
1. 确定初始状态和最终终止状态。
2. 确定对象可能存在的可能状态(对应于不同属性的边界值指导我们识别不同的状态)。
3. 标记触发这些转换的事件。
示例 – 在线订单的状态图 –
![](../../images/20230613410.png)
图 – 在线订单的状态图
我们绘制的UMl图取决于我们要表示的系统。这里只是在线订购系统的示例:
1. 收到订单后,我们会从初始状态转换为未处理订单状态。
2. 然后检查未处理的订单。
3. 如果订单被拒绝,我们将进入“已拒绝订单”状态。
4. 如果订单被接受并且我们有可用的物品,我们将进入已履行的订单状态。
5. 但是,如果商品不可用,我们将进入待处理订单 状态。
6. 订单完成后,我们进入最终状态。在此示例中,我们将两种状态(即“已履行订单”和“已拒绝订单”)合并为一个最终状态。
注意–在这里,我们也可以将已履行订单和拒绝订单分别视为最终状态。
|