概述
对现实世界中事物的观察
现实世界中的各种事物通常都有一个生命周期。在事物被创建后,经过一定阶段的变迁,它可能就结束或消亡了。
例如:生物会经历出生、成长、衰老和死亡的过程;网上购物时,会经历提交订单、待付款、待发货、待收货、待评价、交易成功等过程。
对现实世界中事物的观察结论
很多事物在其生命历程中经历了不同的状态,这些状态是根据对现实的理解并按某种条件或状况而定义的。
事物在任何时候都会处于某种状态中,所有事物都有状态;事物在各时期内所处的状态是明确的。
在现实世界存在着引起事物的状态发生变化的事件,导致事物在不同状态间按顺序转化。
事物从一个状态到另一个状态的变化,通常是即时的,不考虑转换时间。
当事件发生时,事物可能需要采取一些动作。
状态机
状态机是一个类的对象所有可能的生命历程的模型,包含了一个对象在其生命周期内所有的状态序列以及对象接收到事件后所产生的状态转换。
状态机是一个对象的局部视图,用于精确描述一个单独对象的行为。
状态机是表示有限个状态以及这些状态之间转换的模型。
【判断题】状态机描述一个对象的生命周期的动态行为,不能描述多个对象之间的行为协作。对
状态机—组成
主要由对象的各个状态和连接这些状态的转换组成。
- 状态:对象在其生命周期中的一种状况;
- 转换:两个状态之间的一种关系;
- 事件:引起状态变化的事情;
- 动作:状态机中可以执行的原子操作(在运行过程中不能被其他消息所中断);
- 活动:状态机中进行的非原子操作(对象处于某个状态时进行的一系列动作)。
状态机图的定义
状态机图是描述一个特定对象在整个生命周期内,在外部事件的作用下,响应事件所经历的状态变化序列的模型图。
应用场景
常用于对系统行为中受事件驱动的方面进行建模,适合于述跨越多个用例的单个对象的行为,而不适合描述多个对象之间的行为协作。
- UML 1 状态图(Statechart Diagram)
- UML 2 状态机图(State Machine Diagram)
状态机与状态机图
一个状态机图本质上就是一个状态机或状态机的特殊情况的展示。
状态机是一种行为,状态机图显示了一个状态机的所有特征。
状态机图通常完整包含初始状态、终止状态、状态和转换。
状态机图的作用
- 清晰地描述了状态之间的转换及其顺序;
- 清晰地描述了状态转换时所需的触发事件、监护条件和动作等影响转换的因素;
- 清晰的事件顺序有利于程序员在开发程序时避免出现事件错序的情况;
- 通过判定(选择)可以更好地描述工作流因为不同条件发生的分支。
状态机图的组成
-
状态
初始状态、终止状态
简单状态、组合状态、子状态机状态
历史状态 -
转换
-
分支
选择 choice
接合 junction -
同步
分岔(分叉)fork
汇合 join
状态机图的组成
状态
基本概念
状态是指在对象的生命周期中满足某些条件、执行某些活动或等待某些事件时的一个状况。
注意
- 对象在任何时候都会处于某种状态中,所有对象都有状态。
- 对象所处的状态决定了它如何响应所检测到的事件或所接收的消息。
- 通常,事件使对象从一个状态转向另一个状态(即状态的转换)。
表示
用圆角矩形表示,由状态名和活动组成。
- 状态名一般位于圆角矩形中的第一栏。
- 活动放在第二栏,一般由入口动作、出口动作、内部活动、内部转换构成;还可以有子状态和子状态机。
复杂状态可以 包含子状态
简单的状态表示只包含状态名。
状态名(name)
给对象所处状态取的名字,用一个字符串表示的唯一标识符。
入口动作(entry action)
当进入状态时,所执行的动作;通常用来进行状态所需的内部初始化。
格式:entry/进入动作
进入状态时,入口动作在进入转换上的动作之后、状态的任何内部活动之前执行。
出口动作(exit action)
当退出状态时,所执行的动作;通常用来表示从一个状态离开时要进行的处理工作。
格式:exit/退出动作
退出状态时,出口动作在所有内部活动完成之后、离开转换的动作之前执行。
入口动作和出口动作
入口动作和出口动作的目的是封装这个状态,可以不必知道状态的内部情况而在外部使用它。
例:对密码输入(Enter Password)状态,在进入该状态时,首先要清空密码输入框中的字符;在离开该状态前,对密码进行验证,看是否符合指定要求。
内部活动(internal action)
指对象处于该状态时执行的需要一定时间且可以中断的工作。
格式:do/活动名
内部活动一直持续到某个外部事件的到来才中断工作,或者活动结束、状态完成,触发转换。
内部转换(internal transition)
不导致状态改变的转换;只有源状态,没有目标状态,不会执行entry和exit动作。
格式:event 事件名(参数)[监护条件]/动作
注意:内部转换和自转换不同。
延迟事件(defer Event)
也称为可推迟事件,是状态中被延迟处理的事件,是一种特殊的内部转换,不会引起状态的改变;
当对象处于该状态时,事件不会丢失,但会被延迟执行;另一个状态被激活前,才对其进行处理。
语法格式:event 延迟事件/defer
例如:当在Email程序中编辑邮件时,如果在上传第一个附件时,用户下达上传第二个附件的指令,就会被延迟;当第一个附件上传完成后,第二个附件就会被上传。
活动
转换
- 状态的表示—动作
类型
初始状态(初态)
终止状态(终态)
简单状态(状态)
复合状态(组合状态)
历史状态
初始状态
初始状态代表状态机的起始位置。
初态是瞬时的,对象不可能保持在初态,必须有一个输出的无触发转换。从初始状态到普通状态的转换可以包含监护条件和动作,但不能包含触发事件。
注意:
- 初态是一个伪状态(是一种抽象的瞬时状态)。
- 初态只能作为转换的源,不能作为转换的目标。
- 初态在一个状态机图中只允许有一个。嵌套状态中可以使用新的初态。
终止状态
终止状态代表状态机的终止点。
对象可以保持在终态,但不可能有任何形式的输出触发转换。
注意:
- 终止状态不是伪状态!
- 终态只能作为转换的目标,不能作为转换的源。
- 终止状态在一个状态机图中可以有多个。
简单状态
状态由圆角矩形表示,其描述包括状态名、入口和出口动作、内部活动、内部转换等。
复合状态(Composite State)
是内部嵌套有子状态的状态,也称为组合状态。
可以具有初态和终态。
子状态机状态(Submachine State)
是引用了一个状态机的状态,它从概念上是将一个状态机“内嵌”到该状态;这是一种复用手段。
状态(History State)
是一个伪状态,记录组合状态退出时所处的子状态,以便再次进入时从这个状态开始工作。
历史状态(History State)
浅历史:记忆同级别的最后子状态
深历史:记忆所有级别的最后子状态
转换
基本概念
转换用于表示一个状态机的两个状态之间的一种关系。
组成:
一个转换由源状态、触发事件、监护条件、动作和目标状态五部分组成,这五部分不必同时存在。
对象处于源状态时,当某个特定事件发生并满足特定条件,将执行一定的动作,进入目标状态。
在这个状态变化中,称作转换被激发了。激发之前对象所处的状态,就是源状态;激发之后对象所处的状态,就是目标状态。
源状态和目标状态都是相对某一个转换而言的。
- 转换的表示
转换用带箭头的实线段表示,箭尾连接源状态,箭头指向目标状态。
除了源状态和目标状态,一个转换还可以包括触发事件、监护条件和动作。
转换的语法格式:
[转换名称:]触发事件[(参数表)] [监护条件] / [动作]
触发事件
简称事件(Event,也称为事件触发器)是外部作用于一个对象、能够触发对象状态改变的一种现象。
事件可以是系统的内部事件,也可以是外部事件。
外部事件是在系统和它的参与者之间传送的事件,内部事件是在系统内部的对象之间传送的事件。
事件包含一个参数列表(可能为空),用于事件的产生者向其接收者传递消息。
事件可以分成几种,主要包括:信号事件、调用事件、改变事件和时间事件等。
信号事件(Signal Event)
是指一个对象对发送给它的信号的接收事件,可能会在接收对象的状态机内触发转换。
调用事件(Call Event)
是指一个对象对调用的接收,这个对象利用状态的转换而不是利用固定的处理过程实现操作。
调用事件分为同步调用和异步调用;如果调用者需要等待操作的完成,则是同步调用。
改变事件(Change Event)
是指特定布尔表达式所表示的条件满足时,事件发生改变。
语法格式:when(表达式)
注意改变事件与监护条件的区别;改变事件隐含一个对条件的连续计算,直到条件为真激发转换。
时间事件(Time Event)
表示时间表达式被满足的事件,代表时间的流逝。
语法格式:after (相对时间)或at (绝对时间)
例如:after(2 seconds), at(12:00PM)
-
转换的表示—监护条件
监护条件(Guard Condition)是一个布尔表达式,它是触发转换必须满足的条件;若转换没有监护条件,则默认为真。
监护条件的值只在事件被处理时计算一次。 -
转换的表示—动作
动作(action)是转换激活时执行的行为,也称为效果(effect) 、效果列表(effect list)。
当转换被激活后,如果定义了相应动作,则执行该动作。动作是原子性的,因此不可中断。
动作一般是一个简短的处理过程,可以是发送信号、调用操作、创建或销毁对象、读取或设置属性的值、设置返回值,甚至是一个包含多个动作的动作序列。
转换的类型
外部转换
内部转换
自转换( 自身转换)
自动转换(完成转换)