目录

1、状态机图简介

1.1、状态(内部分为4种)

1.2、转移(5个要素)

1.3、事件

1.4、动作(5种基本类型)

2 实际应用

2.1初始/最终/选择状态

2.2 一般状态

2.3 复合状态

2.4 一般转换

3 一个UML状态图实例

3.1 使用visio绘制UML状态图

3.2 实例讲解

推荐教材 UML系统建模基础教程(第3版本)

1、状态机图简介

状态机由状态、转换、事件、活动和动作、分支合并(判定)和分叉汇合(同步)七部分组成。而活动图的主要组成元素包括动作、活动、动组合、分支与合并(采用空心的菱形表示,互斥关系)、分叉与汇合(粗黑线表示,并发关系)、泳道和对象流等。

  • 状态机图描述了一个对象在其生命周期内所经历的各种状态,以及引起对象状态变化的原因。
  • 状态机用于对一个模型元素建立行为模型,该模型元素通常是一个类/对象,也可以是一个 Use Case ,甚至是整个系统。
    在这里插入图片描述

1.1、状态(内部分为4种)

组成:由名称、出入口动作、内部转换、简单状态和组合状态组成    

分为:初始状态(使用一个实心圆表示)、终止状态(类似于初始状态外加一个圆圈),历史状态、简单状态(使用圆角矩形表示,在标识符内部编辑名称及该状态下的动作)和组合状态(顺序子状态和并发子状态)。

  •  一个状态图只能有一个初态,但终态可以有一个或多个,也可以没有终态。

      中间状态包括两个区域:名字域和内部转移域,如图所示。其中内部转移域是可选的。状态图常用于反应型对象建模

  • entry/turnOn:当转入该状态时,做开灯动作。
  • do/blinkFivetimes:当处于该状态时,灯闪烁5次。do活动是只在状态内出现的活动,不能附加到转换上。
  • event poweroff/powerSupplySelf:当电源关闭事件发生时,用自备电源。
  • exit/turnOff:当转出该状态时,做关灯动作。
  • event selfTest/defer:当selfTest事件发生时,对象将延迟响应,到别的状态中再处理,用defer这个特定动作表示延迟。
  • 含有子状态的状态被称为组合或嵌套状态

      组合状态可以使用“与”关系分解为并发子状态,或者通过“或”关系分解为互相排斥的顺序子状态。

  • 顺序子状态:如果一个组成状态的子状态对应的对象在其生命期内的任何时刻都只能处于一个子状态,即多个子状态之间是互斥的,不能同时存在,这种子状态称为顺序子状态
  • 并发子状态:时组合状态有两个或者多个并发的子状态机,此时称组成状态的子状态为并发子状态。
  • 历史状态是伪状态, 其目的是记住从组合状态中退出时所处的子状态, 当再次进入组合状态时, 可以直接进入这个子状态, 而不是再从组合状态的初态开始。

  • 浅(shallow)历史状态, 只记住最外层组合状态的历史。

  • 深(deep)历史状态, 可以记住任意深度的组合状态的历史。

      如下图,running状态被打断到power on状态,再转回到running状态时,希望直接进入历史状态


1.2、转移(5个要素)

  • 转移是两个状态之间的关系,指示处于第一状态的对象将执行某些动作并且当指定事件发生并且满足指定条件时进入第二状态。
    在这里插入图片描述
  • 转移的五个要素(非必须):
    • 源状态 (Source State):受转换影响的状态;如果对象处于源状态,则当对象接收到转换的触发事件并且满足监护条件(如果有)时,可以触发传出转换。
    • 触发事件:一种可以触发源状态以满足监护条件的激励。
    • 监护条件:是原状态向目标状态转移的条件,原状态结束时进行监护条件的判断,只有当监护条件满足时,才能转移到指定的目标状态。
    • 动作:转换激活时的操作。
    • 目标状态 (Target State):转移完成后对象处于的状态。
    • 每个转换只允许有一个事件触发,一个事件只允许有一个动作。转换的五要素:源状态、目标状态、触发事件、监护条件和动作。(触发事件:如果箭头上不带任何事件名,表示是一个自动转换,当与源状态相关的活动完成时就会自动触发)。格式:触发事件(参数)[条件]/动作

    •   举例:与状态off相关的转换有两个,其触发事件都是turnOn,只不过其监护条件不同。如果对象收到事件turnOn,那么将判断壶中是否有水;如果[没水],则仍然处于off状态;如果[有水]则转为on状态,并执行“烧水”动作。

  • 转移的类型:
  • 转换类型

    描述

    语法

    外部转换

    对事件做出响应,引起状态变化或自身转换,同时引发一个特定动作,如果离开或进入状态将引发进入转换、离开转换

    事件(参数)[监护条件]/动作

    内部转换

    对事件做出响应,并执行一个特定的活动,但并不引起状态变化,也不会进入转换、离开转换

    事件(参数)[监护条件]/动作

    进入转换

    当进入某一状态时,执行相应活动

    entry/活动

    退出转换

    当离开某一状态时,执行相应活动

    exit/活动

    对于复合状态之间的转换,需要注意内部转换(Local transition)与外部转换(External transition)的不同。内部转换就是不改变状态,也不会触发输入输出动作。


1.3、事件(4种类型)

包含信号、调用、时间和变化。

  • 事件是对一个时间和空间上占有一定位置的有意义的事情的规格说明。事件是能够引发系统对象状态改变的行为。事件和转移是相伴出现的,事件可以看作是对转移的修饰,描述系统元素状态改变的原因。事件可以有属性和参数,参数放在事件名称后面的括号()内。

  • 在这里插入图片描述
  • 信号signer事件
  •   对象之间通过发送信号和接收信号实现通信。信号是一种异步机制。在计算机中,鼠标和键盘的操作均属于此类事件。对于一个信号而言,对象一般都有相应的事件处理器,如onMouseClick()等。

  • 调用call事件
  •   表示一个操作的调度。一个对象请求调用另一个对象的操作信号是一个异步事件,而调用事件一般是同步的。也就是说,当对象调用另一对象的操作时,控制就从发送者传送到接收者,该事件触发转换,完成操作后,接收者转换到一个新的状态,控制返还给发送者。

  • 变化change事件
  •   用关键字When,后面跟布尔表达式When(temperature>120)/alerm(),变化事件的意图是要频繁测试表达式,只要表达式由假变为真,事件就会发生。

  • 时间time事件
  •   时间事件是指在绝对时间或在某个时间间隔内发生的事情所引起的事件。例如到达某一时间或经过了某一时间段。用关键字When 或After表示。

1.4、动作(5种基本类型)

  • 动作是不可分隔的行为,是行为最小的单元。动作可以是类对象的操作和属性,一个状态中允许有多个动作。而活动是非原子操作。
  • 由于状态图时系统状态间的转移,因此,动作只能表现在状态内部,包括动作类型和名称。
  • 动作的五种基本类型:
    • entry:入口动作,进入状态是发生的动作。
    • exit:出口动作,当前状态结束时发生的动作。
    • do:执行动作,模型元素处于某个状态时执行的动作。
    • include:引用子状态机状态。
    • event:用来指定特定事件触发时发生的动作。
  • 内部动作是模型元素在状态持续过程中执行的动作,执行与该状态相关的行为。内部动作不会改变元素当前状态,在入口动作执行后、出口动作执行前执行。
  • 当内部动作执行完毕时,如果没有完成转移就触发它,否则状态将等待一个显式触发的转移。
  • 如果内部动作正在执行时有一个转移被触发,此时内部动作将被终止,然后执行状态的出口动作。

2 实际应用

状态是状态机的重要组成部分,描述了状态机所在对象动态行为的执行所产生的结果

2.1初始/最终/选择状态

这三个都是伪状态(Pseudostate):

  • 初始状态:用一个实心圆形表
  • 最终状态:用一个圆圈内嵌实心圆点表示
  • 选择状态:用一个菱形表示,条件分支上方括号内的文字表示监护条件(guard conditions)

2.2 一般状态

UML中使用一个圆角矩形表示一个一般状态

状态的组成部分:

  • 名称:由一个字符串组成,用以识别不同状态。可匿名,一般放置在状态图符顶部
  • 入口/出口动作:表示进入/退出这个状态所执行的动作,动作可以是原子动作,也可是动作序列
  • 内部转换:内部转换不会引起状态变化的转换,此转换的触发不会导致状态的入口/出口动作被执行。语法:事件/动作表达式

2.3 复合状态

复合状态,或称组合状态,是指包含有子状态的状态。

如下图,“复合状态2”即为复合状态,内部的“状态2-1”、"状态2-2"为子状态。

也可用以下形式表示,将复合状态的内容单独画出。

注:图中的圆圈内一个H字母,表示历史状态,它也是一个伪状态,其目的是记住从组合状态中退出时所处的子状态,当再次进入组合状态,可直接进入这个子状态,而不是再次从组合状态的初态开始

2.4 一般转换

一般情况下的状态转换是两个不同状态之间的转换,示意图如下:

转换的组成部分:

  • 源状态(Source State):源状态就是被转换影响的状态。某对象处于源状态,当它接收到触发事件或满足监护条件,就会激活一个转换
  • 目标状态(Target State):转换完成后,对象状态发生变化,这时对象所处的状态就是转换的目标状态
  • 触发事件(Trigger):引起转换的事件,这里所指的事件可以是信号、调用、时间段或状态的一个改变
  • 监护条件(Guard Condition):是一个方括号括起来的布尔表达式,它被放在触发事件的后面。监护条件可以引用对象的属性值和触发事件的参数
  • 结果(Effect):对象状态转移后的结果

3 一个UML状态图实例

3.1 使用visio绘制UML状态图

新建一个visio文件,打开后会自动提示选择创建某种类型的图,这里选择"软件和数据库 ->UML状态机"

点击确定之后,会进入UML状态图的编辑界面,左侧可以看到用于UML状态图编辑的基本元素,将这些元素拖拽到右侧的编解面板中,可以看到这些元素的基本结构形式:

3.2 实例讲解

下面是一个UML状态图的实例:

这是一个全自动洗衣机的UML状态图,主要包括“设置”、“工作中”、“暂停”这3个状态。

  • 开机时,会先进入“设置”状态,可以设置洗衣模式以及水量等,触发启动后,会进入“工作中”状态。
  • “工作中”是一个复合状态,内部包括“加水”、“清洗”、“排水”、“甩干”这4个子状态。进入该状态后,从“加水”子状态开始执行,然后会执行“清洗”、"排水"子状态,排水完成后,根据清洗次数是否足够,跳转到“加水”或“甩干”子状态。
  • 在“工作中”状态时,无论处于哪个子状态,只有按了暂停键,都会进入“暂停”状态,再按继续,则会进入“工作中”继续执行,注意继续时指向的是历史状态(圆圈内一个H字母),表示继续指向刚才暂停时的子状态。

原文链接https://zhuanlan.zhihu.com/p/627832677

推荐视频:【6_状态图_统一建模语言UML急性入门-哔哩哔哩】 https://b23.tv/Z88JQuC


Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐