在UML中描述一个状态图的图符除了状态图符和状态转移图符外,还有起始状态、终止状态、条件判定、发出信号、接收信号和并发状态等图符。
(1)起始状态:代表状态图的起始点,本身无状态。起始状态是转移的源点,不是转移的目标。起始状态由一个实心圆表示。
(2)终止状态:代表状态图的最后状态,本身无状态,是状态图的终止点。终止状态是转移的最终目标,不是转移的源点。结束状态由一个空心圆套一个实心圆表示。
(3)条件判定:与程序设计语言中的条件分支类似,条件判定是一个转折点,状态转移按照满足条件的方向进行。条件判定通常为一个入转移、多个出转移。条件是一个逻辑表达式,状态转移沿条件判定为真的分支触发转移。条件判定用空心菱形表示。
(4)并发状态:并发状态描述对象的同步工作状态。并发状态分为分劈和接合两种:并发分劈表示将一个源状态分劈为多个目标状态,多个目标状态是并行转移的;并发接合表示将多个源状态接合为一个目标状态,多个源状态也是并行转移的。并发状态由一条粗短实线表示,称为并发(同步)杆。
(5)信号:在状态图中允许出现信号图符,信号图符分为发出信号图符和接收信号图符。发出信号图符为一个一侧为凸尖角的多边形表示,接收信号图符为一个一侧为凹尖角的多边形。用带实心箭头的虚线表示信号的传输方向。
一个对象的状态图就是由以上这些不同的图符排列组合而成。状态图的基本图符如图6-17所示。
图6-17 状态图的基本图符
状态图是由状态、事件、转移、执行动作和连接点组成的,用来建模对象是如何改变状态的。
1)状态(State)
状态是指对象在生命周期中的条件或状况,在此期间对象将满足某些条件、执行某些活动或等待某些事件。
状态图中的状态表示成圆角矩形。若不展示状态的内部转移细节,就只把状态名写进圆角矩形内,否则用水平线对圆角矩形进行分割。一张状态图中不能出现具有相同名称的状态。起始状态和终止状态是状态图中的两个特殊状态,它们二者都是伪状态(pseudo state),除了名称外没有正规状态的通常部分。
一个状态包含以下几个部分:
①名称(Name):一个将本状态与其他状态区分开来的文本字符串,状态可以匿名。在实际应用中,状态名取自所建模系统的词汇中的名词或名词短语,通常将状态名中的每个单词的首字母大写。
②进入/退出效应(Entry/Exit Effect):分别为进入和退出某状态时所执行的动作。入口动作用“entry/要执行的动作”表达,出口动作用“exit/要执行的动作”表达。
③内部转移(Internal Transition):不导致状态改变的转移。
④子状态(Substate):状态的嵌套结构,包括非正交(顺序活动)子状态和正交(并发活动)子状态。
⑤延迟事件(Deferred Event):指在该状态下暂不处理,而是推迟到该对象的另一个状态下排队处理的事件列表。
2)事件(Event)
“发生的事情”称为事件,指一个在时间和空间上可以定位并具有实际意义的发生的事情。在状态图中,一个事件是一次激励的发生,激励能够触发状态转移。
事件可以分为外部事件和内部事件,外部事件是在系统和它的参与者之间传送的事件,例如按下一个按钮;内部事件是在系统内部的对象之间传送的事件,例如溢出。内部事件包括:
(1)入口事件
入口事件UML提供的标准内部事件,以关键字entry说明,是进入状态时最先执行的一个内部入口动作序列,不带条件。该动作序列不能中断,具有原子性,为隐式调用。只在最高层状态图创建该类的对象时入口事件事可带有参数,其他时候一般不带参数。
(2)出口事件
出口事件是UML提供的标准内部事件,以关键字exit说明,是退出状态时执行的一个内部动作序列,不带条件和参数。该动作序列不能中断,具有原子性,为隐式调用。出口事件在所有内部活动的最后执行,但先于任何出转移。
(3)do事件
do事件是UML提供的标准内部事件,以关键字do说明,是在入口事件之后、出口事件之前执行的一个内部动作序列。do事件引用的不是包含它的对象的某个操作,而是其嵌套子状态图的全部动作序列。该动作序列可以中断。
(4)include事件(www.xing528.com)
include事件是UML提供的标准内部事件,以关键字include说明,在入口事件之后、出口事件之前执行。include事件标识对一个嵌套子状态图的引用,后面的动作表达式中包含该子状态图的名称。
(5)自定义内部事件
自定义内部事件是开发人员根据需要自定义的事件,如为用户提供在线帮助等。自定义内部事件不引起状态转移。例如,自定义内部事件“帮助/口令格式帮助()”为用户在线提示输入口令的格式。
在UML中也可将事件分为信号事件、调用事件、时间事件和变化事件。
(1)信号事件
信号事件也称为信号(Signal),是在实例间进行通信的异步消息的规约。信号是消息的类目。信号可以包含在泛化关系中,可以把一个信号指定为另一个信号的子信号,以此对事件的层次结构建模。如同类一样,信号也可以有属性和操作。
(2)调用事件
调用事件表示对象接到一个操作调用请求。信号事件是一个异步事件,而调用事件一般是同步的。也就是说,当一个对象调用另一个对象的一个操作时,控制传到接收者,该事件触发转移,完成操作后,接收者转移到一个新的状态,控制返还给发送者。通常,一个信号事件由它的状态图来处理,而一个调用事件则由一个方法来处理。
(3)时间事件
时间事件表示到达指定时间时发生的事件。在UML中用关键字after和计算一段时间的表达式来对一个时间事件建模,如“after 2seconds”或者“after 10ssince exiting Idle”;还可以用关键字at和计算时间量的表达式来表示时间事件,如“at(1Jan 2015,12:00UT)”表示该事件发生在格林威治时间2015年1月1日的中午12点。
(4)变化事件
变化事件表示状态的一个变化或某些条件得到满足的事件。用关键字when和布尔表达式来对一个变化事件建模,如“when(altitude<1000)”。这样的布尔表达式的值只要由假变为真,就会发生变化事件,即使之后条件的值变为假,也不会引发事件变化直至它被处理,而当事件一直为真时,也不会重复引发变化事件。
案例学习
◎一个含有时间事件和变化事件的状态图如图6-18所示。
图6-18 含有时间事件和变化事件的状态图示例
图中有两个状态:“Idle”空闲状态和“Active”激活状态,在11:49PM的时候,“Idle”空闲状态发生自转移进行自检;当altitude小于1 000时状态变为“Active”激活状态,2s后激活状态断开连接,回到“Idle”空闲状态。
3)转移(Transition)
转移是两个状态之间的关系,由某个事件触发,然后在第一个状态中执行一定的动作后进入第二个状态。当状态发生这样的转变时,转移被激活。转移用带箭头的直线表示。一个转移由5部分组成:
(1)源状态(Source State):即受转移影响的状态。如果一个对象处于源状态,当该对象接收到转移的触发事件而且警戒条件(如果有)满足时,将激活一个输出转移。
(2)事件触发器(Event Trigger):即能够引起状态转移的事件。源状态中的对象识别了这个事件,则在警戒条件满足的情况下激活转移。
(3)警戒条件(Guard Condition):是一个布尔表达式。当因事件触发器的接收而触发转移时,对这个布尔表达式求值,若值为真则激活转移,若为假则不激活,此时若没有其他的转移能被这个事件触发,则该事件丢失。对于每一个转移,一个警戒条件只在事件发生时被计算一次,如果该转移被重新触发,则警戒条件会被再次计算。
(4)效应(Effect):是在转移激活时所执行的动作。它可以直接作用于拥有状态图的对象,并间接作用于对该对象可见的其他对象。包括在线计算、操作调用、另一个对象的创建或撤销或者向一个对象发送信号。
(5)目标状态(Target State):即转移完成后的活动状态。
转移分为外部转移和内部转移。外部转移是一种改变对象状态的转移,较为常见;内部转移则是在不退出状态的情况下在状态内将事件处理。内部转移自始至终都不离开本状态,所以没有入口事件和出口事件。两种转移的格式是一样的,均为:
事件触发器[(用逗号分隔的参数表)][警戒条件]/[动作表达式]
加了方括号的参数表、警戒条件和动作表达式是可选的。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。