版权归原作者所有,如有侵权,请联系我们

[科普中国]-子状态

科学百科
原创
科学百科为用户提供权威科普内容,打造知识科普阵地
收藏
简介

状态可能有嵌套的子状态,且子状态可以在另一个状态图。子状态又可分为两种:与子状态(and-substate),或子状态(or-substate)。与子状态指的是一个状态可以有子状态,但是一次只能有一个子状态,如图5.14所示。例如,一辆车可以处于运行态,它的运行态可以有两个子状态:前进和后退,它们是或子状态,因为它们不能同时为真。嵌套的子状态可以显示在另一个状态图中,方法是在初始状态图中扩展运行状态。

另一方面,运行态可能有多个并行的子状态(与子状态):前进和低速,前进和高速,后退和低速,后退和高速。当一个状态有与子状态且它们中的几个可以同时为真时,表示一个状态既有与子状态也有或子状态,如图5—15所示。与子状态也称作并行状态,可以用来抽象并行线程的状态。

状态图

状态图主要用来描述对象、子系统、系统的生命周期。通过状态图可以了解到一个对象所能到达的所有状态以及对象收到的事件(收到消息,超时,错误,条件满足)对对象状态的影响等。所有的类,只要它有可标记的状态和复杂的行为,都应该有一个状态图。状态图指定对象的1行为以及根据不同的当前状态行为之间的差别。同时,它还能说明事件是如何改变一个类的对象的状态。

简单状态是没有子结构的状态。具有子状态(嵌套状态)的状态被称为复合状态。子状态可能被嵌套到任意级别。嵌套的状态机最多可能有一个初始状态和一个终止状态。通过显示某些状态只能在特定环境(包含状态)中存在,子状态可以简化复杂的平面状态机。

转移的源状态是包含复合状态之外的源状态,其目标状态可能是复合状态或子状态。如果其目标状态是复合状态,嵌套的状态机就必须包括一个初始状态,在进入复合状态之后并在发出它的进入操作(如果有)之后,控制权将被传递给该初始状态。如果其目标状态是嵌套状态,那嵌套状态的进入操作(如果有)后,控制权将被传递给该嵌套状态。

从复合状态出发的转移可能会以复合状态或子状态作为它的源状态。在这两种情况下,控制权先离开嵌套状态(并在可能的情况下发出它的退出操作),然后离开复合状态(并在可能的情况下发出它的退出操作)。其源状态为复合状态的转移基本上会中断嵌套状态机的活动。

顺序子状态

正如名字所暗示的那样,顺序子状态按照顺序一个接着一个出现。重新分析前面提到的子状态GUI的Working状态,可以得到以下的状态序列:2

Awaiting user lnput(等待用户输入,简单记为Awaiting状态)。

Registering User Input(登记用户输入,简单记为Registering状态)。

Visualizing User Input(显示用户输入,简单记为Visualizing状态)。

用户输入触发了从Awaiting状态到Registering状态的转移。Registering状态内的活动引起了GUI到Visualizing状态的转移。在第3个子状态之后,GUI重新回到Awaiting User Input状态。右图表明了在Working状态中的顺序子状态。

并发子状态特征

处于Working状态时,GUI并不是仅仅只等待用户的输入。它还要监视系统的时钟,(Watch System Clock)或者(很可能)定期更新应用程序的界面显示。例如,一个应用程序可能包括一个屏幕时钟,它的GUI需要定期被更新。2

所有这些与前面的顺序子状态的转移同时进行。尽管每个状态序列是一组顺序子状态,但是两个状态序列之间是并发关系。并发状态之间用虚线隔开,表示状态序列之间是并发关系,如图所示。

当每个部分体只能属于一个整体时,这种关系叫组成关系。working状态和它的两个并发部分之问也有类似的关系。因此,working的状态被称为组成状态(composite state)。只包顺序状态的状态也是组成状态。

状态图的作用是标识对象的状态和行为,以及在对象生命期内在不同的状态下对象的行为变化。可以将活动对象的状态细分为并发子状态,并发子状态下许多动作可以并发执行。子状态不必在它们自己的线程中执行,虽然常有这种情况。

状态图

在状态图中,并发子状态的表示方法是:将状态框用虚线分隔成一些子区域,每一个子区域表示一个子状态,每一个子状态可以有一个可选的状态名,包含一个嵌套的状态图,

也可以用并发状态来抽象激活。子状态显示当前关心的告警,传感器和单元处理器的动作和状态。当且仅当所有的子状态都到达停止状态时,系统的总状态才被激活,否则,将系统放在激活失败状态。

也可以用复杂的状态转移来表示并发。复杂的状态转移可以有多个源和目的状态,可以将控制分成多个并发执行的线程或将多个并发线程合并成一条线程。在这种情况下,状态图的一部分可以并发执行。但是,同使用并发状态的区别是:复杂状态转移中的并发状态没有它们自己的状态机,它们是并发执行的同一级别上的状态。

用一条短的垂直的粗线条表示复杂的状态转移。可能有一条或多条实心箭头从某些状态(称为源状态)指向它的状态转移线,也可能有一条或多条实心箭头从状态转移线指向某些状态(称为目的状态)。在状态转移线的旁边可以有一个转移字符串。只有当对象处于某一源状态且转移守卫条件为真时,状态转移才发生,意味着并发执行开始或结束。

用复杂状态转移表示并发状态的例子如图所示。在每一个子区域内的活动并发执行。1