状态建模
状态模型 类模型表示系统静态的、结构化的“数据”层面。 状态模型表示系统时序的、行为的“控制”层面。 状态模型描述了与操作的时间和顺序相关的对象层面,标记变化的事件,界定事件上下文的状态,以及事件和状态的组织。 状态模型捕获控制,描述操作出现顺序的系统层面。
状态图 状态图(State diagram)主要用来描述对象、子系统、系统的生命周期。通过状态图可以了解到一个对象所能到达的所有状态以及对象收到的事件(收到消息,超时,错误,条件满足)对对象状态的影响等。 所有的类,只要它有可标记的状态和复杂的行为,都应该有一个状态图。状态图指定对象的行为以及根据不同的当前状态行为之间的差别。同时,它还能说明事件是如何改变一个类的对象的状态。 状态模型有多个状态图组成,每个类对应一个状态图,描述对应用程序来说是最重要的那些时序行为。
状态图
状态和迁移 所有对象均有状态:状态是对象操作的前一次活动的结果,通常情况下,状态由对象的属性值以及指向其它对象的链来决定的。类的状态由类中的指定属性来说明或对象的状态由对象中的通用属性的值来确定。下面举例说明对象的状态: 支票(对象)已付(状态)。 汽车(对象)停在那儿(状态)。 发动机(对象)正在运行(状态)。 吉姆(对象)正在卖货(状态)。 小王(对象)已婚(状态) 。 当某些事情发生时对象的状态发生改变,我们称改变对象状态的事情为“事件”,例如,付了支票,开始启动汽车,或结婚。
状态 状态(state)是对象取值和链接的抽象。根据对象的总体行为,将取值和链接的集合组成一个状态。状态经常对应着带有后缀“ing”(如Waiting、Dailing)的动词,或一些状态的持续时间。 事件和状态之间有某种对称性。事件表示时间点;状态表示时间段。状态对应着对象接收的两次事件之间的时间间隔。 状态是对象的生命周期中的一个条件或状况,在此期间将满足某些条件、执行某些活动或等待某些事件
状态 一个状态有以下几个部分: 1、名称(name ):将本状态与其它状态区分开的文本串 2、进入/退出效应(entry/exit effect):分别为进入和退出该状态时所执行的动作。 3、内部转移(internal transition):不导致状态改变的转移。 4、子状态(substate):状态的嵌套结构,包括非正交(顺序活动)和正交(并发活动)子状态。 5、延迟事件(deferred event):指在本状态下暂不处理,将推迟到该对象的另一个状态下排队处理的事件列表。
状态的不同描述 状态:AlamRinging 描述:手表上响铃以指示预定时间 产生状态的事件序列: 刻画状态的条件: 状态中接收的事件: setAlam(targetTime) 不包括ClearAlam的任何序列 When(currentTime=targetTime) 刻画状态的条件: Alarm=on,设定响铃时间为target Time,targetTime<=currentTime<=targetTime+20秒,在targetTime后按下按钮 状态中接收的事件: 事件 响应 下一状态 When(currentTime=targetTime+20) resetAlam normal buttonPushed(any button) resetAlam normal
事件 事件(event)是对一个在时间和空间上占有一定位置的有意义的发生的规约。在状态机中,一个事件是一次激励的发生,激励能够触发状态转移。 事件可以是内部的事件或外部的事件。外部的事件是在系统和它的参与者之间传送的事件。例如一个按钮的按下和来自膨胀传感器的中断是外部事件。内部事件是在系统内部的对象之间传送的事件。溢出异常是一个内部事件。
四类事件 可以用UML对四种事件进行建模 1、信号(signal):是一个具名对象,它由一个对象异步的发送,然后由另一对象接收。信号事件(signal event)是指发送或接收信号的事件。 2、调用事件(call event):一个调用事件表示对象接收到一个操作调用请求。调用事件可能触发状态机中的一个状态转移,或者调用目标对象的一个方法。 3、时间事件(time event):表示一段时间推移的事件或绝对时间上所发生的事件。例如:after 2 seconds。 4、变化事件(change event):表示状态的一个变化或某些条件得到满足的时间。例如:when altitude<1000
事件
迁移 迁移(transition)是指从一个状态到另一个状态的瞬间变化,表示对象在某个特定事件发生并且满足特定的条件满足时将在第一个状态中执行一定的动作,并进入第二个状态。当状态发生这样的变化时,迁移被称作激活了。在迁移激活之前,称对象处于源状态;激活后,称对象处于目标状态。
一个迁移由5部分组成 1、源状态(source state):即受转移影响的状态。 2、事件触发器(event trigger):是一个事件,源状态中的对象识别了这个事件,这在警戒条件满足的情况下激活迁移。 3、警戒条件(guard condition):是一个布尔表达式,当因事件触发器的接收而触发转移时,对表示式求值,若表达式为真则激活转移,若为假则不激活,此时若没有其它的转移能被这个事件触发,则该事件丢失。 4、效应(effect)是一个可执行的行为(比如动作),它可以直接作用于拥有状态机的对象,并间接作用于对该对象是可见的其它对象。 5、目标状态(target state):转移完成后的活动状态
迁移
警戒迁移
单触发状态图 状态图可以表示连续循环或单触发生存期,对有些状态图,不必关心循环如何开始。 单触发状态图表示有限生存期的对象,由初始状态和终止状态 在对象创建时会进入初始状态;进入终止状态时意味着对象被销毁。
国际象棋的状态图
国际象棋的状态图
状态图行为 效应(effect)是对为响应事件而执行的行为的活动。 活动(activity)是由效应触发的实际行为,效应数量不限。 活动表示法是“/”和活动的名称(或描述),跟在引起活动的事件后面。关键词do留下来表示正在进行的活动,不能用作事件名称。
do活动 do活动指持续了一段时间的活动,do活动只会在某个状态内出现,不能附到迁移上。do活动包括连续的操作,例如电视屏幕上显示图像。以及一段时间后会由它们自己终止的顺序操作,例如关闭阀门。
进入和退出活动 要显示在迁移上的活动,可以把活动绑定到某状态的入口或出口。两种表示法的表达能力没有太大差别。 所有进入某状态的迁移经常会执行相同的活动,在这种情况下,更简洁的做法是把活动连接在状态上。 进入活动在状态框内显示为关键词entry和字符“/”。无论何时只要有到达的迁移进入某状态,进入活动就会执行,进入活动等同于把活动连接到每个到达的迁移上。 如果某状态有多个活动,它们可以按照下面的顺序执行:到达迁移上的活动、进入(entry)活动、do活动、退出(exit)活动以及输出迁移上的活动。
迁移上的活动
进入状态上的活动
带有活动的电话线状态图
电梯的状态图(1) 上楼 在第一层 向上移动 到达 上楼 到达 向第一层移动 到达 向下移动 空闲 下楼 超时 图:电梯的状态图。电梯从第一层开始启动。它能够上下移动。如果电梯在某一层上处于 空闲状态,则当超时事件出现时,它就会返回到第一层。本状态图中没有终点(终态)
电梯的状态图(2) 上楼 向上移动 在第一层 Do/到第floor层 到达 上楼 (floor) 到达 向第一层移动 向下移动 到达 空闲 超时 图:状态转移:状态“在第一层”和状态“向上移动”之间的状态转移有一个参数“floor”(不考虑类型), 在“空闲”和“向上移动”之间以及“空闲”和“向下移动”之间的状态转移也有“floor”这个参数
实践技巧 把值抽象为状态。在定义状态的时候,只考虑相关的属性。 参数:为附带数据参数化事件,附带数据不会影响控制流程。 事件和状态的粒度要考虑应用的需求。 何时使用状态图:只为那些有时序意义的类构建状态图。 进入和退出活动。当某个状态有多个到达迁移,并且所有的迁移都会引起相同的活动时使用进入活动。
扩展状态 组织模型的一种方法是用高层框图,带有扩展了某些状态的子图。 子状态机(submachine)是一种状态图,可以作为其它状态图的一部分来调用,子状态机状态图可以替代局部状态,子状态机是状态图的“子程序”。
自动售货机
自动售货机的子状态机Dispense item
嵌套状态 一个状态允许嵌套,以包含子状态;子状态继承其父状态的所有转换。 嵌套状态使得简洁的状态机图成为可能,子状态被嵌套地放在父状态的框图中。 组合状态(composite state)显示外部轮廓、轮廓完全围住嵌套状态。状态可以嵌套到任意深度,嵌套状态会接收其组合状态的输出迁移。
嵌套状态
子状态 子状态(即嵌套状态)是嵌套在另一个状态中的状态。例如:一个加热器Heater可能处于heating状态,且在Heating状态中还有一个嵌套状态Activating。在这种情况下,应该称这个对象既处于Heating状态,又处于Activating状态。 简单的状态是没有子结构的状态。一个含有子状态的状态称为组合状态。组合状态包括并发(正交的)子状态或顺序(非正交的)子状态。子状态可以嵌套到任何层次。
非正交子状态 考虑对一个ATM的行为建模。这个系统有3个基本状态:“空闲”Idle(等待与顾客交互)、“活动”Active(处理一个顾客的事物)和“维护”Maintenance(可能是从新装满现金夹)。 在Active状态下,ATM的行为沿一条简单路径执行:验证客户、选择事物、处理这个事物,然后打印收据。 象Validating和Processing这样的子状态,被称为非正交或不相交的子状态。对象被称为处在该组合状态中,而且一次只能处于这些子状态中的一个子状态上。
顺序子状态:售票系统的状态机模型
正交子状态 在某些建模情况下,可能要说明一些正交的区域。这些区域存在一个对象的语境中并行执行的两个或多个状态机。 下图中两个正交区域的执行是并行的。最终,每个嵌套状态都达到它的终态。如果一个正交区域先于另一个到达它的终态,那么这个区域的控制将在它的终态等待。当两个嵌套状态都到达它们的终态时,来自两个正交区域的控制就汇合成一个流。
并发子状态:选修一门大学课程的并发分解
聚合并发 装配件的状态图由一系列状态图组成,每个部件对应一个状态图。 聚集状态与所有部件的组合状态相对应,聚合是“与关系”。 有些情况下,部件状态会发生交互,一个对象上的迁移可以依赖于处在某个给定状态中的另一个对象。
聚合及其并发的状态图
聚合及并发的状态图
对信号族建模 在大多数事件驱动的系统中,信号事件是分层的。 例如:一个自主机器人可以辨别外部信号(如Collision)和内部信号(如HardwareFault ),两种信号未必互斥,同时HardwareFault 可以进一步特化为BatteryFault和MovementFault。 以这种方式对信号建模,可以说明多态的事件。
对信号族建模