uml基础教程第六章-状态图.ppt
第六章 状态图,本章要点,状态图的定义和作用 状态图中的事件和动作基础内容:状态图中各种标记的表示重点掌握:状态图中的状态、转换和判定一般了解:状态图中的历史状态,UML的状态图(state diagram)能够展示这种变化。它描述了一个对象所处的可能状态以及状态之间的转换,并给出了状态变化序列的起点和终点。状态图主要是明确地说明在什么状态下,哪些事件是有效的,哪些事件是无效的。状态图还可以让我们规划及掌握交互系统的明确行为,以达到准确控制整个系统的目的。,状态图可以描述一个特定对象的全部能够存在的状态,还可以描述引起状态转移的事件。状态图描述一个对象在不同事件的驱动下发生的状态迁移。一般面向对象技术使用状态图来表示单个对象在其生命周期中的行为,描述的是一个对象的生命周期。,6.1 状态图的定义,一、状态机 状态机由状态、动作、事件、活动和转换5部分组成。(1)状态 状态指的是对象在其生命周期中的一种状况,处于某个特定状态中的对象必然会满足某些条件、执行某些动作或者等待某些事件。(2)动作 动作指的是状态机中可以执行的原子操作。原子操作指的是它们在运行的过程中不能被其他消息所中断,必须一致执行下去,最终导致状态的变更或者返回一个值。,(3)事件 事件指的是发生在时间和空间上对状态机来讲有意义的事情,事件通常会引起状态的变迁。(4)活动 活动指的是状态机中进行的非原子的执行,由一系列动作组成。(5)转换 转换指的是两个不同状态之间的一种关系。事件可以触发状态之间的转换。,实例,通常一个状态机依附于一个类,并且描述该类的实例(即对象)对接收到的事件的响应。状态机是一个对象、协作或用例的局部视图,所以适合对局部、细节进行建模。,二、状态图 状态图是对类所描述事件的补充说明,它显示了类的所有对象可能具有的状态,以及引起状态变化的事件。状态图本质上是一个状态机,状态图描述了一个实体基于事件反应的动态行为,显示了该实体如何根据当前所处的状态对不同的事件做出反应。,状态图由表示状态的节点和表示状态之间转换的带箭头的直线组成,若干个状态由一条或者多条转换箭头连接,状态的转换由事件触发。(1)状态:用一个带圆角的矩形表示,框内标有状态的名称和其他信息(2)转换:用带箭头的直线表示,从出发状态指向目标状态。(3)开始状态:是状态图的起点,用实心圆表示。(4)结束状态:是状态图的终点,用一个圆中嵌套一个小实心圆表示(5)判定:是状态图中一个特定位置,工作流在此按条件取值发生分支,用一个空心小菱形表示。(6)同步:定义了并发工作流的分叉与汇合,用一条粗短实线表示。如图6-1,6.2 状态图中的标记,状态图主要由以下标记符组成:状态转换(或转移)判定同步,6.2.1 状态,状态图描述了一个类对象生命周期中的一个时间段。状态用于对实体在其生命周期中的各种状况进行建模,状态由一个带圆角的矩形表示。状态中包括状态名、入口和出口动作、内部活动、内部转换以及嵌套状态组成部分。,如何阅读状态机图阅读最简单的状态图最为核心的元素无外乎是两个:一个是用圆角矩形表示的状态(初态和终态例外);另一个则是在状态之间的、包含一些文字描述的有向箭头线,这些箭头线称为转换,1、状态名 状态名可以把一个状态和其他状态区分开来。状态名指的是状态的名称,通常用字符串表示,其中每个单词的首字母大写。状态名可以包含任意数量的字母、数字和除冒号之外的一些符号。状态名通常放在状态图标的顶部。要注意的是:一个状态的名称在状态图所在的上下文中应该是唯一的,能够把该状态和其他状态区分开。,2、入口和出口动作状态可能具有入口和出口动作。这些动作的目的是封装这个状态,这样就可以不知道状态的内部状态而在外部使用它。入口和出口动作分别指的是进入和退出一个状态时所执行的“边界”动作。入口动作,即系统进入该状态时要发生的动作;出口动作,即系统离开该状态时要发生的动作。,3、内部活动状态可以包含描述为表达式的内部活动。当状态进入时,活动在进入动作完成后就开始。如果活动结束,状态就完成,然后一个从这个状态出发的转换被触发,否则状态等待触发转换以引起状态本身的改变。如果在活动正在执行时转换触发,那么活动被迫结束并且退出动作被执行。,4、内部转换 内部转换指的是不导致状态改变的转换。内部转换中可以包含进入或者退出该状态应该执行的活动或动作。状态可能包含一系列的内部转换,内部转换因为只有源状态而没有目标状态,所以内部转换的结果并不改变状态本身。如果对象的事件在对象正处在拥有转换的状态时发生,那么内部转换上的动作也被执行。,5、嵌套状态状态分为简单状态和组成状态。简单状态是在语义上不可分解的、对象保持一定属性值的状况;而组成状态是内部嵌套有子状态的状态。,6.2.2 转换,转换用于表示一个状态机的两个状态之间的一种关系,即一个在某初始状态的对象通过执行指定的动作并符合一定的条件下进入第二种状态。在UML中,转换用带箭头的直线表示,直线的一端连接源状态,箭头一端指向目标状态。转换涉及的内容包括源状态、触发事件、监护条件、动作和目标状态。,在状态转换中除了源状态和目标状态,还需要掌握外部转换、内部转换、完成转换、监护条件、初始状态和终止状态5个概念。在转换中,这5部分信息并不一定都是同时存在的。,5部分,源状态:即受转换影响的状态目标状态:当转换完成后对象的状态触发事件:用来为转换定义一个事件,包括调用、改变、信号、时间四类事件监护条件:布尔表达式,决定是否激活转换、动作:转换激活时的操作,小结与状态off相关的转换有两个,其触发事件都是turnOn,只不过其监护条件不同。如果对象收到事件turnOn,那么将判断壶中是否有水;如果没水,则仍然处于off状态;如果有水则转为on状态,并执行“烧水”动作而与状态on相关的转换也有两个,如果“水开了”就执行turnOff,关掉开关;如果烧坏了,就进入了终态了,1、外部转换外部转换是一种改变状态的转换,在UML中,它用从源状态到目标状态的带箭头的线段表示,其他属性以文字串附加在箭头旁。如图6-4所示要注意的是:只有内部状态上没有转换时,外部状态上的转换才有资格被激发。否则,外部转换会被内部转换所掩盖。,2、内部转换内部转换只有源状态,没有目标状态,不会激发入口和出口动作。因此内部转换激发的结果不改变本来的状态。如果一个内部转换带有动作,它也要被执行。内部转换常用于对不改变状态的插入动作建立模型。需要注意的是内部转换的激发可能会掩盖使用相同事件的外部转换。,自转移和内部转移的区别,自转移:建模时对象收到一个事件,该事件不会改变对象的状态,却会导致状态的中断,这种事件被称为自转移,它打断当前状态下的所有活动,使用对象退出当前状态,然后又返回该状态,自转移标记使用一种弯曲的开放箭头,指向状态本身。自转移在作用时首先将当前状态下正在执行的动作全部中止,然后执行该状态的出口动作,接着执行引起转移事件的相关动作。,自转移和内部转移的区别,内部转移:在建模时,有时会在不离开一个状态的情况下处理一些事情,如图书馆系统中管理员可以对借阅者信息进行查询,在系统列出借阅信息时还可以对其进行修改,此时并没有离开信息列表状态。这种情况被称为内部转移。内部转移只有源状态而没有目标状态,转移激发的结果并不改变状态本身,如果一个内部转移带有动作,动作也要被执行,但由于没有状态改变发生,因此不需要执行入口动作和出口动作。内部转移和自转移不同,虽然两者都不改变状态本身,但有着本质的区别。自转移会触发入口动作 和出口动作,而内部转移 却不会。,3、完成转换完成转换是没有明确标明触发器事件的转换,它由状态中活动的完成引起。完成转换也可以带一个监护条件,这个监护条件在状态中的活动完成时被赋值,而不是活动完成后被赋值。,4、监护条件是一个布尔表达式。当对象接收到触发事件要触发转换时,对该布尔表达式求值。若为真,则激活转换;取值为假,则不激活转换,所接收到的触发事件丢失。,5、初始状态和终止状态初始状态代表状态图的起始位置,在UML中一个状态图只能有一个初始状态,用一个实心圆表示。终止状态是一个状态图的终点,一个状态图可以拥有一个或者多个终止状态。,复杂转换,复杂转换 例子,只有动作描述,进入和退出和操作方法写在了里面,各种转换的区别进入和退出转换:当进入一个状态时,执行某个动作;或当退出某个状态时,执行什么动作。这时就可以使用进入和退出转换 来表示内部转换:用来处理一些不离开该状态的事件,6.2.3 判定,判定又称为“决策点”,它用来表示一个事件依据不同的监护条件有不同的影响。判定将转换路径分为多个部分,每一个部分都是一个分支,都有单独的监护条件。在UML中判定用空心菱形表示。在状态图中,判定可以覆盖所有的可能,保证一些转换被激发。否则,状态图就会因为输出转换不再重新激发而被冻结。通常情况下判定有一个转入和两个转出,根据监护条件的真假可以触发不同的分支转换,如图。,6.2.4 同步,同步是为了说明并发工作流的分支与汇合,状态图和活动图中都可能用到同步。在UML中,同步用一条线段来表示。同步用一条线段来表示,如图。,并发分支表示把一个单独的工作流分成两个或多个工作流,几个分支的工作流并行进行。并发汇合表示两个或者多个并发的工作流在此得到同步,这意味着先完成的工作流需要在此等待,直到所有的工作流到达后,才能继续执行以下的工作流。,要注意同步与判定的区别:判定是根据监护条件使工作流分支,监护条件的取值最终只会触发一个分支的执行。例如,如果分支A和分支B,假设监护条件为真时执行分支A,那么分支B就不可能被执行,反之则执行分支B,分支A就不可能被执行。而同步的不同分支是并发执行的,并不会因为一个分支的执行造成其他分支的中断。,6.3 状态图中的动作和事件,状态转移线添加一些细节,可以指明引起转移发生的事件和引起状态变化所需执行的计算(动作)。添加的事件和动作写在转移线上,触发器事件和动作名之间用反斜杠隔开。,6.3.1 事件,事件表示对象可以探测到的各种变化如接收到从一个对象到另一个对象的调用或显示信号,某些值的改变或时间的流逝。任何能够影响到对象的东西都可以称为事件,它在一个时间点上发生,没有持续的时间段。在状态机中,一个事件的出现可以触发状态的改变。事件主要包括:信号事件、触犯器事件、调用事件、改变事件和时间事件等。,1、信号事件 信号事件指在实时系统运行中,对象接收到一个系统外界的信号,从而使对象的状态发生迁移的事件。信号事件中的信号是作为两个对象之间的通信媒介的命名的实体,它以对象之间显示通信为目的。,2、时间事件 时间事件表示时间表达式被满足的事件,它代表时间的流逝,时间事件仅用做转换的触发。指对象的状态在绝对时间上或某个时间段内自动发生迁移。时间事件经常由系统外界设定的时间段产生,其时间表的运行可能来源于操作系统,或者是系统应用中的自身运算。,3、改变事件 指的是依赖于特定属性值的布尔表达式所表示的条件满足时,事件发生改变。改变事件指对象的内部或外部条件发生变化而引起的对象状态发生变化的事件。,4、触发器事件 指的是引起源状态转换的事件。事件不是持续发生的,它只发生在时间的一点上,对象接收到事件,导致源状态发生变化,激活转换并使监护条件得到满足。,5、调用事件 调用对象是指系统之外的其他系统通过接口和某种协议,直接执行该系统内部的对象行为,从而引发对象状态的迁移。指的是一个过程的执行点上激发一个操作,它将一个控制线程暂时从调用过程转换到被调用过程。调用发生时,调用过程的执行被阻断,并且在操作执行中调用者放弃控制,直到操作返回时重新获得控制。,事件的种类,6.3.2 动作,动作通常是一个简短的计算处理过程或一组可执行语句。动作也可以是一个动作序列,即一系列简单的动作。通过动作可以给另一个对象发送消息、调用一个操作、设置返回值、创建和销毁对象。,动作的种类,6.4 常用状态的种类,通常状态可以分为简单状态和复合状态。简单状态指的是不包含其他状态的状态,也就是说简单状态没有子结构。而复合状态包括顺序状态、并发状态和历史状态等,它们都具有子结构,即一个系统在同一时刻可以包含多个状态。,复合状态表示法,6.4.1 顺序状态,如果多个子状态之间是互相排斥而不能同时存在的,这种状态称为顺序状态。一个顺序状态最多可以有一个初始状态和一个终止状态。正如名字所暗示那样,顺序状态按照顺序一个接着一个出现。,ADSL拨号过程的状态机,它将拨号过程封装成一个组合状态“连接ISP”。最初的状态是“未连接”,当用户发出指令时,将进入“连接ISP”状态,如果在此过程中用户取消拨号或发现无拨号音,无应答音时将回到“未连接”状态,如果收到应答音,则进入“已连接”状态。建立大致印象后再分析组合状态“连接ISP”,会发现组合状态中也包含一个初态和终态,这是复杂组合状态所包含的状态机的初态和终态。,顺序复合状态图,监护条件为“应答音”,代表已连接。,6.4.2 并发状态,所有这些与前面的顺序子状态的转移同时进行。尽管每个状态序列是一组顺序子状态,但是两个状态序列之间是并发关系。并发状态之间用虚线隔开,表示状态序列之间是并发关系。,并发复合状态图,三种评测方式,例如,获取驾驶执照在报名后,需要在理论学习后通过理论考试、自主练车和教练专人指导后通过驾驶,而这些都以并行开始。包含并发子状态机的复合状态“学习”中有2个并发区域,也就是当已报名考取驾照之后就可以根据自身情况时间安排学习了,着手进行理论学习和理论考试、自主练车等。(1)如果理论考试不及格,则直接转换到状态“未能获得驾照”;同样驾驶考试不通过,也直接转换到状态“未能获得驾照”。(2)要想获得驾照,则必须将两个并发区域中的每个状态机都转换到终态,即经过理论学习通过理论考试、经过自主练车和教练专人指导通过驾驶考试。,6.4.3 历史状态,用来说明组成状态曾经有的子状态 在状态图中,至今还未涉及由其他窗口所打开的窗口。换句话说,也就是子状态中嵌入其他子状态。当一个历史状态记忆了各个嵌套层次的子状态时,这个历史状态就是深的(deep)。如果它只记忆了最高层次嵌入的子状态,那么就说这个历史状态是浅的(shallow)“H”。深的历史状态用圆圈中的“H*”来表示,例子,“一个圆圈中加上字母H”,是用来表示历史状态的。它的含义是:当从状态“结账”和“显示购物车”返回子状态“显示索引信息”时,将进入的是离开时的历史状态。也就是说,转到购物车或结账区之后,再回到“浏览目录”的页面时,其中的内容是不变的,仍然保留原来的信息。,MP3播放器对象的Active复合状态具有4个子状态:即播放(Play)、前进(Forward)、后退(Back)和停止(Stop),其中子状态之间可互相转换。从任一子状态都能到“暂停”状态。当用户取消暂停恢复播放器的活动状态时,MP3播放器对象将直接进入历史状态。,子状态机,将子状态机单独定义,并对其进行命名(通常以大写字母开头),然后在需要使用的地方来引用它,下图引用C状态机,画状态图的步骤,(1)确定要描述的对象(不是全部),选择那些状态变化对实现系统功能影响大的对象。(2)确定状态空间,即对象在其生命周期中所有状态的总和。包括确定状态的粒度,粒度反映了分析者对问题域的理解和问题域的本质。(3)确定引起状态迁移的事件。,如何绘制状态机图,绘制状态机图绘制状态机图的理想步骤是:寻找主要的状态,确定状态之间的转换,细化 状态内的活动与转换,用复合状态来展开细节寻找主要状态:对于航班机票预订系统而言,显然包括的状态主要有-在刚确定飞机计划时,显然是没有任何预订的,并且在有人预订机票之前都将处于这种“无预订”状态-对订座而言显然有“部分预订”和“预订完”两种状态-而当航班快要起飞时,显然要“预订关闭”总结一下,主要有四种状态:无预订、部分预订、预订完以及预订关闭确定状态间转换,确定状态间转换,确定状态间转换表格横向是转出表格纵向是转入,确定状态间转换,细化状态内的活动与转换,使用复合状态,使用复合状态,状态机图应用说明对对象生命周期建模:主要描述对象能够响应的事件、对这些事件的响以及过去对当前行为的影响对反应型对象建模:这个对象可能处于的稳定状态、从一个状态到另一个状态之间的转换所需的触发事件,以及每个状态改变时发生的动作状态机图既可以用来表示一个业务领域的知识,也可以用来描述设计阶段对象的状态变迁,使用状态图建模的好处,状态图清晰的描述了状态之间的转换顺序,通过状态的转换顺序可以清晰地看出事件的执行顺序;清晰的事件顺序有利于程序员在开发程序时避免出现事件错序的情况。状态图清晰地描述了状态转换时所必须的触发事件、监护条件和动作等影响转换的因素,有利于程序员避免程序中非法事件的进入;状态图通过判定可以更好的描述工作流因为不同的条件发生的分支。,思考题,1.状态图在哪些重要方面与类图、对象图或用例图有所不同?2.给出下列术语的定义:转移、事件和动作。3.顺序状态和并发状态有什么区别?,状态图练习题,办公室复印机的工作过程大致如下:未接到复印命令时处于闲置状态,一旦接到复印命令则进入复印状态,完成一个复印命令规定的工作后又回到闲置状态,等待下一个复印命令;如果执行复印命令时发现缺纸,则进入缺纸状态,发出警告,等待装纸,装满纸后进入闲置状态,准备接受复印命令;如果复印时发生卡纸故障,则进入卡纸状态,发出警告等待维修人员来排除故障,故障排除后回到闲置状态。请用状态转换图描绘复印机的行为。,状态图之间的消息发送(医院监护系统实例),医院病房监护系统的状态图,实例讲解网上书店的订单对象为例,订单对象有确认订单、等待到款、等待受理、已受理、已发货、交易成功和取消7种状态。(1)“确定订单”后根据订单的付款方式决定向下一个状态的转换。若付款方式=网银支付,则订单对象进入“等待到款”状态,若付款方式=货到付款,则订单对象直接进入“等待受理”状态;用户付款成功后,订单对象可由“等待到款”状态转换为“等待受理”状态;(2)订单对象处于“等待到款”或“等待受理”状态时,用户可取消交易,由此订单对象转换为“取消”状态;(3)订单对象处于“等待受理”状态,若书店销售管理员受理了订单,则更新订单状态,订单对象转换为“已受理”状态;(4)订单对象处于“已受理”状态,书店发货,销售管理员更新订单状态订单对象转换为“已发货”状态;(5)用户收到货物,书店确认后“交易成功”。,状态图建模实例,画出电梯升降的状态图 电梯升降有5个状态:在第一层、向上移动、向下移动、空闲、向第一层移动。有3个循环圈:“空闲”状态与“向下移动”状态之间、“空闲”状态与“向上移动”状态之间、以及一个大循环。确定并标注引起状态转移的事件,“超时”是指电梯的空闲状态超过某个规定的时间值。,