状态机图

Posted 月夜魂归

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了状态机图相关的知识,希望对你有一定的参考价值。

笔记软件在2023/4/6 14:26:40推送该笔记

状态机图用于模拟各个类对象,用例和整个系统的动态行为。换句话说,当一个状态机创建它所附着的对象,该对象成为状态机的所有者时,例如,状态机附加的对象可以是类,用例甚至整个系统。

什么是UML中的状态机图?参考

状态机图是一种行为,它指定对象在其生命周期中响应事件所经历的状态序列。状态机用于指定必须响应异步刺激或其当前行为取决于其过去的对象的行为。状态机用于模拟对象,用例甚至整个系统的行为,尤其是反应系统,它们必须响应来自系统外部的参与者的信号。

在UML中,状态机除了传统的起始图表符号之外还引入了两个新概念:

  • 复合和嵌套状态
  • 正交区域

状态机图表符号 (State Diagram Notations)

状态是对象生命期间的条件,它可以满足执行某些活动的某些条件,或者等待接收某些事件。

一个状态有五个部分:

  1. 状态名 - 状态名称
  2. 进入 - 进入状态的行动
  3. 做活动 - 在进入状态时执行的行动
  4. 退出状态 - 在离开状态下执行的操作
  5. Deferrable Trigger - 在该状态下未处理的事件列表,而是被推迟并排队等待另一个状态的对象处理。

对象在有限的时间内保持状态。例如,家中的加热器可能处于以下四种状态中的任何一种:空闲,冷却,加热,启动和活动。                                                       过渡
  • 转换是两个状态之间的关系,指示处于第一状态的对象将执行某些动作并且当指定事件发生并且满足指定条件时进入第二状态。
  • 过渡火灾意味着发生状态变化。在转换触发之前,对象处于源状态; 它发射后,据说处于目标状态。
  • 过渡分为五个部分:
  • 来源状态 - 受过渡影响的状态
  • 事件触发器 - 一种可以触发源状态以满足保护条件的激励,
  • 保护条件 - 在接收事件触发器触发转换时计算的布尔表达式,
  • 操作 - 可执行的原子计算,可以直接作用于拥有状态机的对象,并间接作用于对象可见的其他对象,
  • 目标状态 - 转换完成后处于活动状态。

来源状态和目标状态

源状态 (Source State):受转换影响的状态;如果对象处于源状态,则当对象接收到转换的触发事件并且满足保护条件(如果有)时,可以触发传出转换。

目标状态 (Target State):过渡完成后处于活动状态。

事件 (Events)

事件是在某个时间点发生的离散信号。它也被称为刺激和对象的一种输入。以下是事件的特征:

  • 可能会导致状态发生变化
  • 可以触发操作 - 操作可以是内部操作或外部操作
  • 可能有相关的条件
  • 信号事件可用于在状态机之间进行通信

警卫条件 (Guard Condition)

  • 状态过渡标签 - 事件[警卫条件]
  • Condition是一个布尔函数
  • 条件在状态机上是可选的
  • 条件适用于有限的时间段
  • 发生事件时,条件必须为true才能发生状态转换。如果condition为false,则不会发生状态转换。

动作 (Action)

由于状态转换的瞬间执行动作。状态转换标签可以表示为以下格式

  • 活动/行动
  • 事件[条件] /行动
  • 进入/退出行动

决策节点 (Decision Node)

决策节点用于表示测试条件,以确保控制流或对象流仅沿一条路径下降。

Fork节点是伪状态,用于将进入的转换分成两个或多个终止于正交目标顶点的转换。从fork顶点传出的段不得有保护或触发器,并且它必须只有一个传入和至少两个传出转换。

Join节点是伪状态,用于合并从不同正交区域中的源顶点发出的若干转换。进入连接顶点的过渡不能有保护或触发,它必须至少有两个传入过渡和一个传出过渡。

合并节点 (Merge Node)用于将使用决策节点创建的不同决策路径重新组合在一起。                                                     
选择 (Choice) 是一种伪状态,当达到该状态时,导致动态评估其传出转换的触发器的保护。这实现了动态条件分支。它允许将转换分成多个传出路径,以便决定采用哪条路径。

示例:状态机图的选择节点

Terminate是伪状态,表示状态机的生命线已经结束。终止伪状态由十字表示。

与最终状态不同,终止伪状态意味着由于上下文对象被终止而终止状态机。除了与导致终止状态的转换相关联的操作之外,状态机不执行任何状态的退出,也不执行任何退出操作。

复合状态 (composite State)

简单状态是没有子结构的状态。复合状态可以进一步细分为子状态(在状态内或单独的图中)。具有子状态(嵌套状态)的状态称为复合状态。

子状态可以嵌套到任何级别。

嵌套状态机可以具有至多一个初始状态和一个最终状态。

通过显示某些状态仅在特定上下文(封闭状态)内可能,子状态用于简化复杂的平面状态机。

复合状态与子机状态 (Composite State vs Sub-machine State)

除了复合状态,还有另一个称为子机状态的符号,它在语义上等同于复合状态。

正交状态 (Orthogonal State)

甲复合状态具有两个或更多个区域被称为正交。与复合状态不同,子机状态旨在对状态进行分组,因此您可以重用它们。正交状态分为由虚线分隔的两个或更多个区域:

每个区域的一个状态在任何时间点始终是活动的,即同时的基板

进入:转换到正交状态的边界激活所有区域的初始状态

退出:必须在所有区域达到最终状态才能触发完成事件。

注意:

您可以使用并行和同步节点来指定不同的子状态。Concurrent Substates是独立的,可以在不同的时间完成。

历史状态 - 浅/深

历史状态允许状态机重新进入在离开复合状态之前处于活动状态的最后一个子状态。历史状态使用的示例如下图所示:

何时绘制状态机图?

您可以在以下情况下使用状态机:

  • 在业务建模期间,您可以创建状态机来为用例场景建模。
  • 在分析和设计过程中,您可以对事件驱动的对象建模,这些对象会响应对象上下文之外的事件。
  • 在分析和设计过程中,您可以使用多个状态机图来显示同一状态机及其行为的不同方面。

如何绘制状态机图?

可以通过以下步骤开发用例模型。

  1. 识别具有复杂行为的实体或标识参与其生命周期将被指定的行为的类
  2. 模型状态 - 确定实体的初始状态和最终状态
  3. 模型转换
  4. 模型事件 - 识别影响实体的事件
  5. 从初始状态开始,跟踪事件的影响并确定中间状态
  6. 确定状态的任何进入和退出操作
  7. 必要时使用子状态扩展状态
  8. 如果实体是一个类,请检查该类的操作和关系是否支持该状态中的操作,如果不扩展该类
  9. 根据需要进行细化和精心制作

你也可以:

  • 为抽象目的绘制用于逻辑分类状态的子状态

状态机图示例

下面的数字时钟状态机图示例显示了简单数字时钟的接口:

附加类的状态机图:

用于建模DigitalClock行为的状态图:

下面提供了一些更多的State Machine Diagram示例。

状态机图示例:烤面包机

状态机图示例:烤箱

状态机图示例:计算机测试
此示例通过使用两个区域表示两组并发子状态。

状态机器图例子:人生

此示例通过使用两个区域表示两组并发子状态。

状态机图示例

可在在线状态机图软件中编辑的自由状态机图示例和模板:Visual Paradigm Online。使用模板作为起点来创建自己的状态机图。

烤箱

数码时钟

正交状态

复合状态

加热器

烤面包机

售票系统

电话

UML 状态机图

状态机图

状态机图对一个单独对象的行为建模,指明对象在它的整个生命周期里,响应不同事件时,执行相关事件的顺序。

? ?

如下示例, 下列的状态机图显示了门在它的整个生命周期里如何运作。

技术分享

门可以处于以下的三种状态之一: "Opened"打开状态, "Closed"关闭状态,或者"Locked"锁定状态。 它分别响应事件:"Open"开门, "Close"关门, "Lock"锁门 和 "Unlock"解锁。 注意:不是所有的事件,在所有的状态下都是有效的。如:一个门打开的时候是不可能锁定的,除非你关上门。并且,状态转移可能有附加监护条件:假设门是开的,如果"doorWay->isEmpty"(门是空的)被满足,那么它只能响应关门事件。状态机图使用的语法和约定将在下面的部分进行讨论。

状态

状态被表示为圆角矩形,状态名写在里面。

技术分享

起始和结束状态

初始状态表示为实心黑圆环,可以标注名称。结束状态表示为中心带黑点圆环,也可以被标注名称。

技术分享

转移

一个状态到下一个状态的转移表示为带箭头实线。转移可以有一个"Trigger"触发器,一个"Guard"监护条件和一个"effect"效果。如下所示:

技术分享

"Trigger"触发器是转移的起因,它可以是某个条件下的一个信号,一个事件,一个变化或一个时间通路。"Guard"监护是一个条件,而且必须为真,以便于让触发器引起转移。效果"Effect"是直接作用到对象上的一个动作,该对象具有做为转移结果的状态机。

状态活动

在上面的状态转移示例中,一个效果与该转移相关联。如果目标状态有多个转移到达,并且每一个转移都有相同的效果与它相关联,那最好将该效果与目标状态相关联,而不与转移相关联。你可以通过为这个状态定义初始动作来实现。下图显示了一个带入口动作和出口动作的状态。

技术分享

可以定义发生在事件上的动作或一直发生的动作。每一种类型的动作是可以定义任意数量的。

自转移

一个状态可能有一个返回到自身的转移,如下图。效果与转移关联是十分有帮助。

技术分享

复合状态

一个状态机图可以有子状态机图,如下图所示:

技术分享

可选择不同方式显示相同信息,如下图所示:

技术分享

上面版本的标注说明"Check PIN"的子状态机图显示在单独的图中。

入口点

有时,你不想在正常的初始状态进入子状态机。例如下面的子状态机,它通常从"初始化"状态开始,但是如果因为某些原因,它不必执行初始化,可能靠转移到指定的入口点来从 "Ready" 状态开始。

下图显示了状态机的上一层。

技术分享

出口点

有与入口点相类似的方式,它可能也指定可选择的出口点。下图给出了主处理状态执行后,所执行状态的去向将取决于该状态转移时所使用的路径。

技术分享

选择伪状态

选择伪状态显示为菱形,有一个转移输入,两个或多个输出。下图显示不管到达哪一个状态,经过选择伪状态后的去向,取决于在伪状态中执行时所选择的消息格式。

技术分享

连接伪状态

连接伪状态用来将多个状态转移链接在一起。一个单独的连接伪状态可以有一个或多个输入和一个或多个输出,监护可能应用于每一个转移,连接是没有语义的。连接可以把一个输入转移分成多个输出转移来实现一个静态分支。与之对照的是选择伪状态实现一个动态条件分支。

技术分享

终止伪状态

进入终止伪状态是指状态机生命线已经终止。终止伪状态表示为叉号。

技术分享

历史状态

历史状态用来当状态机中断时,恢复状态机之前状态。下面例图说明了历史状态的使用。这个例子是关于洗衣机的状态机。

在这个状态机中,当洗衣机运行时,它会按照"Washing" 到Rinsing"再到"Spinning"来进行。如果电源被切断 ,洗衣机会停止运行并进入"Power Off" 状态。当电源恢复,运行状态在"History State"符号处进入,表示它会从上次离开的地方恢复。

并发区

一个状态可以被分成几个不同的区,包含同时存在和执行的子状态。下面的例子显示状态 "Applying Brakes", "front brake"和"rear brakes" 将同时独立运作。注意使用了分叉和结合伪状态而不是选择和合并伪状态。这些符号用来同步并发的线程。

技术分享

以上是关于状态机图的主要内容,如果未能解决你的问题,请参考以下文章

UML 状态机图

状态机图

UML状态机图

UML中状态机图概念

领域模型-UML硬核精细防疫指南(类图和状态机图)

UML大战需求分析——阅读笔记03