利用状态图模拟响应系统,反应系统模型声明周期,将静态的业务可以动态流动起来,按照预定的状态进行业务描述。
一、基本概念
状态(state)是指在对象的生命期中的某个条件或状况,在此期间对象将满足某些条件、执行某些活动或等待某些事件。所有对象都具有状态,状态是对象执行了一系列活动的结果,当某个事件发生后,对象的状态发生变化。
状态图(statechart diagram)用来描述一个特定的对象所有可能的状态,以及由于各种事件的发生而引起的状态之间的转移和变化。并不是所有的类都需要画状态图,有明确意义的状态,在不同状态下行为有所不同的类才需要画状态图。
状态机是计算机科学理论的一部分,但UML中的状态机模型主要是基于David Harel所做的扩展,是用来展示状态与状态之间转换的图。
二、基本元素
1.状态的组成部分
- 状态名(name)
- 进入/退出动作(entry/exit action)
- 内部转换(internal transition)
- 子状态(substate)
- 延迟事件(defferred event)
2.状态图的要素
- 椭圆或圆角矩形:表示对象的一种状态,椭圆内部填写状态名
- 箭头:表示从箭头出发的状态可以转换到箭头指向的状态
- 事件:引起状态转换的原因。事件名可在箭头线上方标出
- 条件:事件名后加方括号,括号内写状态转换条件
- 动作:转换激活时的操作
- 实心圆:初始状态
- 内部实心的同心圆:最终状态
3.状态的类型
①按状态过程分:
一个状态图只能有一个初态,但终态可以有一个或多个,也可以没有终态。
中间状态包括两个区域:名字域和内部转移域,如图所示。其中内部转移域是可选的。
- entry/turnOn:当转入该状态时,做开灯动作。
- do/blinkFivetimes:当处于该状态时,灯闪烁5次。do活动是只在状态内出现的活动,不能附加到转换上。
- event poweroff/powerSupplySelf:当电源关闭事件发生时,用自备电源。
- exit/turnOff:当转出该状态时,做关灯动作。
- event selfTest/defer:当selfTest事件发生时,对象将延迟响应,到别的状态中再处理,用defer这个特定动作表示延迟。
②含有子状态的状态被称为组合或嵌套状态
组合状态可以使用“与”关系分解为并发子状态,或者通过“或”关系分解为互相排斥的顺序子状态。
- 顺序子状态:如果一个组成状态的子状态对应的对象在其生命期内的任何时刻都只能处于一个子状态,即多个子状态之间是互斥的,不能同时存在,这种子状态称为顺序子状态。
- 并发子状态:有时组合状态有两个或者多个并发的子状态机,此时称组成状态的子状态为并发子状态。
③历史状态是伪状态, 其目的是记住从组合状态中退出时所处的子状态, 当再次进入组合状态时, 可以直接进入这个子状态, 而不是再从组合状态的初态开始。
浅(shallow)历史状态, 只记住最外层组合状态的历史。
深(deep)历史状态, 可以记住任意深度的组合状态的历史。
如下图,running状态被打断到power on状态,再转回到running状态时,希望直接进入历史状态
4.转换(Transition) 转换是两个状态间的一种关系,表示对象将在当前状态中执行动作,并在某个特定事件发生或某个特定的条件满足时进入后继状态。每个转换只允许有一个事件触发,一个事件只允许有一个动作。
- 转换的五要素:源状态、目标状态、触发事件、监护条件和动作。(触发事件:如果箭头上不带任何事件名,表示是一个自动转换,当与源状态相关的活动完成时就会自动触发)。格式:触发事件(参数)[条件]/动作
举例:与状态off相关的转换有两个,其触发事件都是turnOn,只不过其监护条件不同。如果对象收到事件turnOn,那么将判断壶中是否有水;如果[没水],则仍然处于off状态;如果[有水]则转为on状态,并执行“烧水”动作。而与状态on相关的转换也有两个,如果“水开了”就执行turnOff,关掉开关;如果烧坏了,就进入了终态了。
- 转换的类型
转换类型 | 描述 | 语法 |
---|---|---|
外部转换 | 对事件做出响应,引起状态变化或自身转换,同时引发一个特定动作,如果离开或进入状态将引发进入转换、离开转换 | 事件(参数)[监护条件]/动作 |
内部转换 | 对事件做出响应,并执行一个特定的活动,但并不引起状态变化或进入转换、离开转换 | 事件(参数)[监护条件]/动作 |
进入转换 | 当进入某一状态时,执行相应活动 | entry/活动 |
退出转换 | 当离开某一状态时,执行相应活动 | exit/活动 |
5.事件(Event) 事件是对一个时间和空间上占有一定位置的有意义的事情的规格说明。事件触发状态的转移。
- 信号signer事件
对象之间通过发送信号和接收信号实现通信。信号是一种异步机制。在计算机中,鼠标和键盘的操作均属于此类事件。对于一个信号而言,对象一般都有相应的事件处理器,如onMouseClick()等。
- ②调用call事件
表示一个操作的调度。一个对象请求调用另一个对象的操作信号是一个异步事件,而调用事件一般是同步的。也就是说,当对象调用另一对象的操作时,控制就从发送者传送到接收者,该事件触发转换,完成操作后,接收者转换到一个新的状态,控制返还给发送者。
- 变化change事件
用关键字When,后面跟布尔表达式When(temperature>120)/alerm(),变化事件的意图是要频繁测试表达式,只要表达式由假变为真,事件就会发生。
- 时间time事件
时间事件是指在绝对时间或在某个时间间隔内发生的事情所引起的事件。例如到达某一时间或经过了某一时间段。用关键字When 或After表示。
6.状态图建模步骤:
①找出适合用模型描述其行为的类。
②确定对象可能存在的状态。
③确定引起状态转换的事件。
④确定转换进行时对象执行的相应动作。
⑤对建模的结果进行相应的精化和细化。
三、简单案例
采样点位状态变更过程:初始状态为待采样,如果点位采集到了样品,则变更点位状态到已采样,点位存在无法采样情况,可以取消采样,变更状态到无效,点位存在当前不可以采样,可以变更状态到待补采,采集的样品交接完毕,点位变更状态到已完成,采样活动结束。
至此,针对UML状态图的相关内容做了大概的总结,利用状态图,可以快速掌握具体对象的生命周期。