该篇文章是UML知识的扩充。
什么是状态图
源文链接:https://www.visual-paradigm.com/guide/uml-unified-modeling-language/what-is-state-machine-diagram/
实体的行为不仅是其输入的直接结果,而且还取决于其先前的状态。实体的过去历史最好用有限状态图或传统上称为自动机的方式建模。UML
状态图(或有时称为状态图、状态机)显示实体的不同状态。状态图还可以显示实体如何通过从一种状态更改为另一种状态来响应各种事件。状态图是用于对系统的动态性质进行建模的UML
图。
一、为何要使用状态图?
状态图通常用于描述对象的状态相关行为。一个对象根据它所处的状态对同一事件做出不同的响应。状态图通常应用于对象,但可以应用于对其他实体具有行为的任何元素。例如:角色、用例、方法、子系统等等,它们通常与交互图(通常是时序图)结合使用。
例如:
假设您的银行账户中有100,000美元。取款函数的行为是:余额=余额-取款金额,前提是提款后的余额不少于0美元;无论您从银行取款多少次都是如此。在这种情况下,提取不会影响属性值的抽象,因此对象的总体行为保持不变。
但是,如果提款后账户余额变为负数,那么提款功能的行为将完全不同。这是因为银行账户的状态由正变为负;在技术语中,从积极状态到消极状态的转换被触发。
属性值的抽象是系统的属性,而不是全局适用的规则。例如:如果银行更改业务规则,允许银行余额透支2000美元,则将重新定义银行账户的状态,条件是提款后的余额不得少于2000美元的赤字。
注意:
- 状态图描述是所有事件(以及单个对象的状态和转换)
- 序列图描述了涉及所有对象的单个交互的事件
二、状态图的基本概念
什么是状态:
Rumbaugh定义:状态是对象的属性值和连接的抽象。根据影响对象总体行为的属性,将一组值合成一个状态。
状态符号
三、状态图符号的特征
一般来说,无论其类型如何,状态都有几个特征:
- 一个状态占用一个时间间隔。
- 状态通常与满足某些条件的实体的属性值的抽象相关联。
- 实体更改其状态不仅是当前输入的直接结果,而且还取决于其输入的某些过去历史。
3.1 状态
状态是对象生命周期中的一个约束或一种情况,其中一个约束成立,对象执行一个活动或等待一个事件。
状态图是由以下部分组成的图:
- 状态(简单状态或复合状态)
- 连接状态的过渡线
例子:
3.1.1 状态特征
- 状态表示对象在特定时间点的状态。
- 对象(或系统)可以被视为从一个状态移动到另一个状态。
- 模型元素生命周期中满足某些条件的点,其中执行某些特定操作或等待某些事件。
3.1.2 初始状态和最终状态
- 状态图的初始状态,称为初始伪状态,用实心圆表示。从此状态的转换将显示第一个真实状态。
- 状态机图的最终状态显示为同心圆。开环状态图表示可能在系统终止之前终止的对象,而闭环状态图没有最终状态,如果是这种情况,则该对象将一直存在,直到整个系统终止。
例子:
3.2 事件
事件签名被描述为事件名称(逗号分隔参数列表)。事件出现在状态的内部转换隔间或状态之间的转换上。事件可能是以下四种类型之一:
- 信号事件——对应异步消息或信号的到达
- 调用事件——对应于对操作的程序调用的到来
- 时间事件——在指定时间过去后发生时间事件
- 更改事件——只要满足指定条件,就会发生更改事件。
3.2.1 事件的特征
- 表示导致对象从一种状态转换到另一种状态的事件。
- 内部或外部事件触发一些活动,这些活动会改变系统及其某些部分的状态。
- 事件传递信息,这些信息由对象操作详细说明。对象实现事件。
- 设计涉及检查状态图中的事件并考虑系统对象将如何支持这些事件。
3.3 过渡线
过渡线描绘了从一种状态到另一种状态的移动。每条转换线都标有导致转换的事件。
- 将系统视为一组状态和状态之间的转换对于描述复杂行为非常有用。
- 理解状态转换是系统分析和涉及的一部分。
- 转换时从一种状态到另一种状态的运动。
- 状态之间的转换发生如下:
- 元素处于源状态
- 发生事件
- 执行了一个动作
- 元素进入目标状态
- 多个转换发生在不同事件导致状态终止或转换存在保护条件时。
- 没有事件和动作的转换称为自动转换。
3.4 动作和活动
动作是一种可执行的原子计算,包括操作调用、创建或销毁另一个对象或向对象发送信号。一个动作与转换相关联,在此期间一个动作是不可中断的——例如,进入和退出。
活动与状态相关联,状态是非原子的或正在进行的计算。活动可能会运行到完成或无限期地继续。一个Activity将被一个事件终止,该事件导致从定义该Activity的状态转换。
3.4.1 动作和活动的特征
- 状态可以触发动作
- 状态可以有第二个隔间,其中包含在实体处于给定状态时执行的操作或活动。
- 动作是原子执行,因此可以不间断的完成。
- 五个动作触发器:
On Entry
、Do
、On Event
、On Exit
、Include
- 活动捕获可能长时间运行的复杂行为——活动可能会被事件中断,在这种情况下,当对象到达某个状态时,他不会完成。
四、简单状态图的符号
4.1 进入和退出操作
状态中指定的进入和退出动作。每次进入/退出事件都必须为真。如果不是,那么仅必须在各个过渡线上使用操作。
- Entry进入状态时执行的动作,符号为:
Entry/action
- Exit退出状态时执行的操作,符号为:
Exit/action
示例-进入/退出操作(检查账簿状态)
这个例子说明了一个从一个类——“BookCopy”派生的状态图。
注意:
- 此状态图显示了BookCopy类中对象myBkCopy的状态
- 进入动作:任何被标记为链接到进入动作的动作都会在通过转换进入给定状态时执行
- 退出动作:任何被标记为链接到退出动作的动作都会在状态通过转换离开时执行
4.2 子状态
简单状态时没有子结构的状态。具有子状态(嵌套状态)的状态称为复合状态。子状态可以嵌套到任何级别。嵌套状态最多可以有一个初始状态和一个最终状态。子状态用于通过显示某些状态仅在特定上下文(封闭状态)内才可能来简化复杂的平面状态图。
子状态示例-加热器
状态图通常用于派生测试用例,这里列出了可能的测试思路:
- 空闲状态接收太热事件
- 空闲状态接收太冷事件
- Cooling/Startup状态接收Compressor Running事件
- Cooling/Ready状态接收Fan Running事件
- Cooling/Running状态接收OK事件
- 冷却/运行状态接收故障事件
- 失败状态接收失败清除事件
- 加热状态接收OK事件
- 加热状态接收失败事件
4.3 历史状态
除非另有说明,否则当转换进入复合状态时,嵌套状态图的操作会从初始状态重新开始(触发转换直接针对子状态)。历史状态允许状态机重新进入在离开复合状态之前处于活动状态的最后一个子状态。下图展示了一个历史状态使用的例子。
4.4 并发状态
如上所述,状态图中的状态可以嵌套。相关的状态可以组合成一个单一的复合状态。当一个活动涉及并发子活动时,在其他活动中嵌套状态属实必要的。以下状态图对具有两个并发子状态的拍卖进行建模:处理投标和授权支付限额。
并发状态图示例-拍卖过程
在此示例中,首先进入拍卖的状态图需要在开始时分叉成两个单独的开始线程。每个子状态都有一个退出状态来标记线程的结束。除非有异常退出(Canceled或Rejected),否则当两个子状态都退出时才会退出复合状态。