一、定义
状态机图是一种动态图 。描述一个特定对象的所有可能的状态以及引起状态转换的事件。
二、构成
状态机由状态、转移、事件和动作等组成。
1、状态
状态(state)是指对象在其生命周期中,满足某些条件、执行某些活动或等待某些事件时的一个状况
如图书馆的一本书籍可能有:“在架”、“借出”、“被预借”等状态。
(1)标准状态
在UML中,状态使用圆角矩形表示,一个状态有自己的状态名称,状态中包含该状态下将执行的动作和事件 。
- entry为进入状态时的动作,当进入该状态时要执行的动作;
- do为处于该状态下执行的动作。
- exit为退出动作,当离开当前状态时要执行的动作。
- event为在该状态下定义相应的事件动作。
(2) 初始状态
初始状态代表状态机图的开始,使用实心圆表示。一个状态机图只有一个初始状态。
(3)结束状态
结束状态表示一个状态机图的结束,使用实心的圆环表示。一个状态机图可以有多个结束状态。
(4)组合状态
组合状态是状态内部嵌套有子状态的状态。一个组合状态包含一系列子状态。
而没有嵌套的状态称之为简单状态。
(5)子状态
嵌套在一个状态内部的状态为子状态。可以根据状态是否同时存在,可以再细分为顺序子状态和并发子状态。
顺序子状态 :在组合状态的生命周期中,任何时刻只能处于一个子状态,即多个子状态之间是互斥的关系,不能同时存在。
并发子状态 :多个顺序的子状态可以同时存在。
(6)历史状态
历史状态是一种伪状态,它表示在状态再次转移到该组合状态时,应处于上一次退出时的一个子状态。
一个音乐播放器的一个状态机图。其中“播放”标记为历史状态。其含义是在播放状态转移到暂停状态,当由暂停再进入播放状态时,其应进入“播放”状态退出时的一个子状态,它可能在退出时是“顺序播放”状态,也可能是“随机播放”状态,也可能是“倒序播放”状态,但必须是退出“播放”状态时所处的一个历史状态。
2、转移
转移(Transition)指的是两个不同状态之间的一种关系,是对象在满足一定条件或发生某个事件时,从一种状态迁移到另外一种状态。
(1)转移五要素 :
- 源状态:即受转换影响的状态。
- 目标状态:当转换完成后对象的状态
- 触发事件:当源状态的对象接收到事件时转移才有可能被激活。触发事件有自己的名称,也可以有自己的参数。
- 监护条件:布尔表达式,决定是否激活转换
- 动作:转换激活时的操作
(2)转移分类:
分类 | 说明 |
---|---|
外部转移 | 是一种改变状态的转移,是状态机中常见的一种转移。主要出现在两个不同的状态之间。 |
内部转移 | 是指不会导致状态改变的转换。有时,我们需要在该状态下处理一些无需离开状态的事件,这时可以定义一个内部转移。如“借阅图书”这个状态中event。 |
自转移 | 如果源状态与目的状态是同一状态, |
3、事件
事件(Event)是指在特定时间或空间内出现,并能够导致状态转移的信号、超时、条件改变、时间段等。
主要包括信号事件、时间事件、改变事件和调用事件等。
(1)信号事件
信号事件(signal event)是指一个对象接收到信号的事件,该接收信号的事件会导致其状态的转换。
(2)时间事件
时间事件(time event)代表时间的流逝。当时间条件被满足时可能要触发某个事件。时间可以是相对的也可以绝对的。如:after(9:00)。
(3)改变事件
改变事件(change event)是指依赖特定属性值的逻辑表达式所表示的条件满足时,事件发生。
(4)调用事件
调用事件(call event)表示一个对象接收到一个对调用的请求,这个对象用状态的转移而非特定的处理过程来实现操作。操作的参数即是事件的参数。调用结束时,被调用者将返回结果给调用者,调用者可以继续执行。
4、动作
动作通常是一个简短的计算处理过程,如赋值操作或算术运算。动作也可以是一个动作序列,包括给另外一个对象发送消息、调用一个操作、设置返回值、创建或销毁对象。
动作具有原子性。