状态机图,UML 1.x规范中称状态图,是一个展示状态机的图。 状态机图基本上就是一个状态机中元素的投影,这也就意味着状态机图包括状态机的所有特征。状态机图显示了一个对象如何根据当前状态对不同事件做出反应的动态行为。 状态机图主要由状态和转换两种元素组成。 状态机图用于对系统的动态方面进行建模,适合描述一个对象在其生命周期中的各种状态及状态的转换。

目录

  • 基本概念
  • 状态机
  • 状态机图作用
  • 状态机图的组成
  • 简单状态
  • 转换
  • 转换名
  • 事件
  • 监护条件
  • 效果列表
  • 伪状态
  • 初态
  • 选择
  • 复合状态
  • 顺序复合状态
  • 并发复合状态
  • 历史状态
  • 退出节点
  • 画状态机图的注意事项
  • 状态机图的建模技术
  • 状态机图示例
  • 例子(1):简单的状态机图—吃饭状态
  • 例子(2)需求岗工作状态
  • 例子(3)订单状态机图
  • 例子(4)音乐播放
  • 例子(5)取消航班
  • 例子(6)系统进程状态机图

基本概念

  • 状态机图,UML 1.x规范中称状态图,是一个展示状态机的图
  • 状态机图基本上就是一个状态机中元素的投影,这也就意味着状态机图包括状态机的所有特征
  • 状态机图显示了一个对象如何根据当前状态对不同事件做出反应的动态行为。
  • 状态机图主要由状态和转换两种元素组成。

状态机

状态机是一种行为,它说明对象在其生命周期中响应事件所经历的状态变化序列以及对那些时间的响应。
一般情况下,一个状态机依附于一个类,用来描述这个类的实例的状态及其转换,和对接收到的事件所做出的响应。此外,状态机也可以依附于用例、操作、协作等元素上,描述它们的执行过程。
状态机从对象的初始状态开始,响应事件并执行某些动作,从而引起状态的转换;在新状态下又继续响应事件并执行动作,如此循环进行到对象的终结状态。

状态机主要由状态、转换、事件、动作和活动5部分组成:

  • 状态表示对象的生命周期中的一种条件或情况。
  • 转换表示两种状态间的一种关系。
  • 事件表示在某一时间与空间下所发生的有意义的事情。
  • 动作表示一个可执行的原子操作,是UML能够表达的最小计算单元
  • 活动表示状态机中的非原子执行,一般由一系列动作组成。

ios 状态机应用 状态机有什么用_状态机

状态机图作用

状态机图用于对系统的动态方面进行建模,适合描述一个对象在其生命周期中的各种状态及状态的转换
状态机图的作用主要体现在以下几点:

  • 状态机图描述了状态转换时所需的触发事件和监护条件等因素,有利于开发人员捕捉程序中需要的事件。
  • 状态机图清楚地描述了状态之间的转换及其顺序,这样就可以方便地看出事件的执行顺序,状态机图的使用节省了大量的描述文字。
  • 清晰的事件顺序有利于开发人员在开发程序时避免出现事件错序的情况
  • 状态机图通过判定可以更好地描述工作流在不同的条件下而出现的分支

状态机图的组成

状态图(State Diagram)=状态(State)+转移(Transition)

简单状态

状态是状态机图的重要组成部分,它描述了一个对象稳定在的某一个持续过程或所处状况,与动态行为的执行所产生的结果。
当对象满足某一状态的条件时,该状态被称为激活的。
在UML中,状态分为简单状态与复合状态。

  • 简单状态就是没有嵌套的状态。
  • 初态和终态是两个特殊的状态,分别表示状态机的入口状态和出口状态。对于一个不含嵌套结构的状态机,只能有一个初态,可以有一个或多个终态甚至没有终态。

ios 状态机应用 状态机有什么用_ios 状态机应用_02

状态一般由状态名称、子状态、入口动作和出口动作、内部执行活动、内部转换和可推迟事件组成。对于简单状态而言,不会有子状态。

状态名称:可以把一个状态与其他状态分别开来,即状态名称必须在当前层次内保持唯一。没有名称的状态被称为匿名状态
入口动作与出口动作:由其它状态转移到当前状态或从当前状态转移到其它状态时要附带完成的动作。表示为“entry /动作表达式”和“exit /动作表达式”
内部执行活动:当对象进入一个状态时,在执行完入口动作后就开始执行该活动。使用“do/活动表达式”来表示。
内部转换:指的是不导致状态改变的转换。内部转换只有源状态而没有目标状态。表示为“事件名称(事件参数)/活动表达式”
可推迟事件:不会触发状态的转换,且当对象处于该状态时事件可能会被推迟,但不会丢失。格式为“事件名称/defer”

转换

转换是两种状态间的一种关系。它指明当特定事件发生或特定条件满足时,处于某状态(源状态)的对象将执行某一动作或活动并进入另一状态(目标状态)。
转换表示为从源状态指向目标状态的实线箭头,并附有转换的标签。转换的标签格式如下:

⌊转换名称:⌋opt 事件名称opt ⌊(参数列表)⌋opt ⌊[监护条件]⌋opt ⌊/效果列表⌋opt

转换名

转换名称是转换的标识符。在实际使用中,为了防止转换名称与转换的触发器或监护条件混淆,一般不必为转换命名
对于一个转换,除了源状态、目标状态外,还要有事件、监护条件和效果列表等内容。这三个部分的内容对转换不是必需的,在使用时要根据转换所表达的具体语义来添加相应内容

事件

  • 事件是在某一时间与空间下所发生的有意义的事情,是系统执行中发生的值得建模的事物。
  • 事件一般被状态或转换所发送和接收。在转换中被接收的事件也被称为该转换的触发器或触发事件
  • 事件包含一个参数列表(可能为空),用于从事件的产生者向其接收者传递信息。

对应于触发器转换,没有明确的触发器的转换成为结束转换或无触发器转换,是在状态的内部活动执行完毕后隐式触发的

能够在触发器中接收的事件有以下四种:

  • 调用事件:调用事件表示对象接收到一个调用操作的请求。其期待的结果是事件的接收者触发一个转换并执行相应的操作
  • 改变事件:改变事件的发生依赖于事件中某个表达式所表达的布尔条件。改变事件没有参数,要一直等到条件被满足才能发生
  • 信号事件:信号由一个对象准确地送给另一个或一组对象。发送给一组对象的信号可能触发每个对象的不同转换。
  • 时间事件:时间事件的发生依赖于事件中的一个时间表达式。比如,可以让对象进入某状态后经过一段给定的时间或到达某个绝对时间后发生该事件。

ios 状态机应用 状态机有什么用_状态机_03

监护条件

  • 监护条件是一个转换被激发之前必须满足的一个条件
  • 监护条件是一个布尔表达式,可以根据触发器事件的参数、属性和状态机所描述的对象的链接等写成。当转换接收到触发事件后,只有监护条件为真,转换才能被激活
  • 对监护条件的检验是触发器计算过程的一部分,对于每个事件监护条件只检查一次。如果事件被处理时监护条件为假,那么除非再次接收到一个触发事件,将不会再重新计算监护条件的值。

效果列表

  • 效果列表是一个过程表达式,在转换被激活时执行,表示转换附加的效果
  • 效果列表包括多个动作,可以根据操作、属性、拥有对象的连接、触发器事件的参数等写成。动作可以是一个赋值语句、算术运算、发送事件、调用对象的属性或操作、创建或销毁对象等。
  • 效果的表达语法与其实现的具体内容有关。

ios 状态机应用 状态机有什么用_状态机图_04

伪状态

伪状态指的是在状态机中具有状态的形式,却具有特殊行为的顶点
当一个伪状态处于活动时,系统不会处理事件,而是瞬间自动转换到另一个状态,并且这种转换是没有事件进行显式触发的。
最常见的伪状态包括初态、选择、分叉与结合、历史状态等。

初态

初态实际上不是一个真正的状态,它更像是状态机的入口。初态的具体语义概念是模糊的且是瞬时的,不能存在触发器进行触发,否则对象将可能会长时间停留在一个语义不明的初态中。

选择

选择是状态机中的一个伪状态节点,用于表达状态机中的分支结构。

  • 一个选择节点将一个转换分割为两个片段,即将触发事件与监护条件分离。
  • 选择节点不同分支上的监护条件应该覆盖所有情况,否则状态机将不知道如何运行。

ios 状态机应用 状态机有什么用_状态机图_05

复合状态

复合状态是指包含有一个或多个嵌套状态机的状态

顺序复合状态:当顺序复合状态被激活时,只有一个子状态会被激活。
并发复合状态:复合状态中包括两个或多个并发执行的子状态机。

在复合状态中,我们可以先将一部分细小的状态组合成一个状态机,把这个新的状态机作为总状态机图中的一个复合状态来呈现。

顺序复合状态

顺序复合状态又被称为非正交状态,是仅含一个状态机的复合状态
当顺序复合状态被激活时,只有一个子状态会被激活。它只增加了一层子结构,没有增加额外的并发性。

ios 状态机应用 状态机有什么用_UML_06

并发复合状态

并发复合状态,也称正交复合状态,是包括两个或多个并发执行的子状态机的复合状态
并发复合状态将复合状态分成若干个正交区域,每个区域都有一个相对独立的子状态机。如果该并发复合状态是激活的,那么该状态中每个区域都将有一个状态是激活的。

ios 状态机应用 状态机有什么用_触发器_07

历史状态

历史状态代表上次离开组成状态时的最后一个活动子状态,它用一个包含字母“H”的小圆圈表示
每当转换到组成状态的历史状态时,对象便恢复到上次离开该组成状态时的最后一个活动子状态,并执行入口动作。
历史状态是一个伪状态(Pseudostate),其目的是记住从组合状态中退出时所处的子状态,当再次进入组合状态,可直接进入这个子状态,而不是再次从组合状态的初态开始。
深历史状态保存的更深的嵌套层次中的子状态。

例:打印预览

ios 状态机应用 状态机有什么用_触发器_08

例:洗衣机

ios 状态机应用 状态机有什么用_状态机图_09

在上图的状态图中,正常的状态顺序是:【Washing】- >【Rinsing】->【Spinning】。
如果是从状态【Rinsing】突然停电(Power Cut)退出,,洗衣机停止工作进入状态【Power Off】,当电力恢复时直接进入状态【Rinsing】。

退出节点

ios 状态机应用 状态机有什么用_ios 状态机应用_10

画状态机图的注意事项

避免把某个“程序动作”当作是一种“状态”来处理。那么如何区分“动作”和“状态”?“动作”是不稳定的,即使没有条件的触发,“动作”一旦执行完毕就结束了;而“状态”是相对稳定的,如果没有外部条件的触发,一个状态会一直持续下去。
状态划分时漏掉一些状态,导致跳转逻辑不完整。所以在设计状态机时,我们需要反复的查看设计的状态图或者状态表,最终达到一种牢不可破的设计方案

状态机图的建模技术

为对象的生命周期建模:

  • 确定状态机的语境。
  • 设置状态机的初态和终态。
  • 决定该对象的状态机中可能需要响应的事件。
  • 从初态到终态,列出这个对象可能处于的所有顶层状态。用转移将这些状态连接起来,明确转移的触发器和监护条件,接着向转移中添加效果动作。
  • 识别状态是否需要有入口动作和出口动作。
  • 如果需要,使用子状态来对顶层状态进行嵌套。
  • 检查状态机中提供的事件是否与所期望的相匹配;检查所有事件是否都已经被状态机所处理。
  • 检查状态机中的动作是否能由类或对象的关系、操作等支持。
  • 跟踪状态机,确保状态机是良构的,即不存在无法到达的状态,也不会发生停机。

状态机图示例

例子(1):简单的状态机图—吃饭状态

做需求时,需要了解以下六种元素:起始、终止、现态、次态(目标状态)、动作、条件,我们就可以完成一个状态机图了。

ios 状态机应用 状态机有什么用_UML_11

  • 现态:是指当前所处的状态。
  • 条件:又称为“事件”,当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。
  • 动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。
  • 次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。

例子(2)需求岗工作状态

ios 状态机应用 状态机有什么用_状态机图_12

例子(3)订单状态机图

ios 状态机应用 状态机有什么用_UML_13

例子(4)音乐播放

ios 状态机应用 状态机有什么用_状态机_14

例子(5)取消航班

ios 状态机应用 状态机有什么用_状态机_15

例子(6)系统进程状态机图

ios 状态机应用 状态机有什么用_ios 状态机应用_16