2第10章状态机图状态机图描述从一种状态迁移到另一种状态的控制流程,常用来对系统的动态特征进行建模。在大多数情况下,它用来对反应型对象(外部事件触发对象,对象接收到事件后产生响应)的行为建模。310.1什么是状态机图状态机图描述对象在整个生命周期内,在外部事件的作用下,从一种状态迁移到另一种状态的关系图。利用状态图可以精确地描述对象在生命周期内的行为特征。状态图的节点是状态(包括初始状态和终止状态),关系是迁移。如图10-1所示便是一个典型的状态机图。410.2状态图的表示一个状态图包含的元素有初始状态、终止状态、状态、迁移和分支,下面分别描述元素的语义和表示方法。510.2.1状态的表示1.初始状态2.终止状态3.状态(1)状态名称(2)entry/action(3)exit/action(4)do/activity(5)event/action(argument)610.2.2迁移的表示迁移是指对象在事件的作用下,当监护条件为真时执行一定的动作。迁移分四种类型(外部迁移、内部迁移、自动迁移和复合迁移)。下面主要介绍外部迁移的表示法。外部迁移用带箭头的直线表示,箭尾连接源状态(转出的状态),箭头连接目标状态(转入的状态)。每个迁移可能包含三个要素:(1)0或多个事件。(2)0或多个监护条件。(3)0或多个动作。710.2.2迁移的表示图10-7所示为烧水器的状态图。我们用该图说明迁移的三要素。810.2.2迁移的表示1.源状态2.目标状态3.事件1)调用事件2)信号事件3)改变事件4)时间事件4.监护条件5.动作6.活动7.理解简单状态图910.2.3分支的表示对象在外部事件的作用下,根据监护条件的不同值,转向不同的目标状态,即对象的状态根据监护条件的取值而发生分支。分支用空心小菱形表示,如图10-13所示。根据监护条件的真假可以触发不同的分支迁移。如图10-14所示,对象处于状态1时,当某个事件作用于对象,这时就要计算监护条件,当条件满足时(true),对象的状态变为状态2;当条件不满足时(false),对象状态变为状态3。1010.3迁移的分类迁移表示当一个外部事件作用于对象,在监护条件得到满足时,对象在源状态下执行一系列的动作后,转向目标状态。迁移进入的状态称为活动状态,迁移离开的状态变为非活动状态。迁移通常分为外部迁移(用实线箭头表示)、内部迁移(在状态的第二栏中表示,格式是:事件名/动作名)、自动迁移(不需要监护条件下,离开原先状态,然后又回到原先状态)和复合迁移4种。1110.3.1外部迁移外部迁移是一种改变对象状态的迁移。外部迁移用从源状态到目标状态的箭头表示。如图10-15所示即描述了火车上卫生间的简单状态迁移,该卫生间存在3个状态,包含5个外部迁移。1210.3.2内部迁移内部迁移是指状态不变的情况下,事件引发的动作。内部迁移自始至终都不离开源状态,所以不会产生入口动作和出口动作。因此,当对象处于某个状态进行一些动作时,可以把这些动作看成是内部迁移。在图10-16中,当处在登录口令状态(EnterPassword)时,以下的两个动作都不会改变当前的状态。(1)用户设置密码时,当前状态不会发生改变,可以把这一动作建模为内部迁移:set/resetpassword。(2)显示帮助时,当前状态也不会改变,可以把这一动作建模为内部迁移:help/showhelp。1310.3.3自动迁移自动迁移是指在没有事件触发的情况下,当监护条件为真时执行某些动作。它是离开某个状态后重新进入原先的状态,激发状态的入口动作和出口动作的执行。1410.3.4复合迁移复合迁移由简单迁移组成,它通过分支判定,把多个简单迁移组合在一起,如图10-17所示。1510.4状态的分类状态机图中的状态分为简单状态和复合状态两种。1610.4.1简单状态简单状态是指不包含子状态的状态,但简单状态可以具有内部迁移、入口动作和出口动作等。如图10-18所示的便是某销售POS机的工作流程:当客户到收银台后,收银员逐一输入用户购买的商品,输入完之后,计算出总金额,然后等待用户付款,确定支付成功之后,完成收银,等待下一个客户。1710.4.2复合状态复合状态是指状态本身包含一个或者多个子状态机的状态。复合状态中包含的多个子状态之间的关系有两种:一种是并发关系,另一种是互斥关系。如果子状态是并发关系,则称子状态为并发子状态;如果子状态是互斥关系,则称子状态为顺序子状态。1.顺序子状态1810.4.2复合状态2.并发子状态1910.4.2复合状态3.复合状态表示法1)将子状态机嵌入圆角矩形中2)将复合图标嵌入圆角矩形中2010.4.3历史状态当状态机通过迁移从某种状态转入复合状态时,被嵌套的子状态机一般要从子状态机的初始状态开始执行,除非转到特定的子状态。但是在有些情况下,当离开一个复合状态,重新又进入复合状态时,并不希望从复合包含的子状态机的初始状态开始执行,而是希望直接进入上次离开复合状态时的最后一个活动子状态,此时需要用一个包含字母“H”的小圆圈表示最后一个活动子状态,称为历史状态。下面考虑一个MP3播放器对象的状态图,如图10-22所示。2110.4.4子状态机间的异步通信在很多情况下,并发子状态机之间可能需要异步通信。为了实现异步通信,我们采用的策略是:一个子状态机设置某个属性值,在另一个子状态机中,在某个迁移的监护条件中使用该属性值。在图10-23中,订单处理状态包含了两个并发的子状态机:第一个子状态机包含两个状态,即接收支付和已支付;第二个子状态机也包含两个状态,即配货和发货。2210.4.5建立状态机图的步骤绘制状态机图的一般步骤如下。(1)寻找主要的状态。(2)寻找外部事件,以便确定状态之间的迁移。(3)详细描述每个状态和迁移。(4)把简单状态图迁移为复合状态图。2310.5状态机图应用1.对对象的生命周期建模2.对反应型对象建模2410.6小结本章介绍了状态的概念和UML表示法,然后引入状态机的概念,并通过例子逐一说明简单状态机图、复合状态的状态机图的概念。2510.7习题1.对象的状态的语义是什么?对象的状态和对象的属性有什么区别?2.状态机与状态图有什么区别?3.状态机图由哪5个部分组成?4.举例说明迁移的类型和表示方法。5.举例说明:简单状态、顺序子状态、互斥子状态、历史状态的表示法和应用。