状态机图

基本概念: 状态机图,UML 1.x规范中称状态图,是一个展示状态机的图。

状态机图基本上就是一个状态机中元素的投影,这也就意味着状态机图包括状态机的所有特征。状态机图显示了一个对象如何根据当前状态对不同事件做出反应的动态行为。

 

状态机图主要由状态和转换两种元素组成。

 

状态机

  状态机是一种行为,它说明对象在其生命周期中响应事件所经历的状态变化序列以及对那些时间的响应。

  一般情况下,一个状态机依附于一个类,用来描述这个类的实例的状态及其转换,和对接收到的事件所做出的响应。此外,状态机也可以依附于用例、操作、协作等元素上,描述它们的执行过程。

  状态机从对象的初始状态开始,响应事件并执行某些动作,从而引起状态的转换;在新状态下又继续响应事件并执行动作,如此循环进行到对象的终结状态。

 

状态机主要由状态、转换、事件、动作和活动5部分组成。

1)状态表示对象的生命周期中的一种条件或情况。

2)转换表示两种状态间的一种关系。

3)事件表示在某一时间与空间下所发生的有意义的事情。

4)动作表示一个可执行的原子操作,是UML能够表达的最小计算单元

5)活动表示状态机中的非原子执行,一般由一系列动作组成。

UML之状态机图_触发器

 

状态机图作用:状态机图用于对系统的动态方面进行建模,适合描述一个对象在其生命周期中的各种状态及状态的转换。

 

状态机图的作用主要体现在以下几点:

1)状态机图描述了状态转换时所需的触发事件和监护条件等因素,有利于开发人员捕捉程序中需要的事件。

2)状态机图清楚地描述了状态之间的转换及其顺序,这样就可以方便地看出事件的执行顺序,状态机图的使用节省了大量的描述文字。

3)清晰的事件顺序有利于开发人员在开发程序时避免出现事件错序的情况。

4)状态机图通过判定可以更好地描述工作流在不同的条件下而出现的分支。

 

 

状态机图的组成: 简单状态、转换、伪状态。

简单状态

  状态是状态机图的重要组成部分,它描述了一个对象稳定在的某一个持续过程或所处状况,与动态行为的执行所产生的结果。

  当对象满足某一状态的条件时,该状态被称为激活的。

  在UML中,状态分为简单状态与复合状态。

    a.简单状态就是没有嵌套的状态。

    b.初态和终态是两个特殊的状态,分别表示状态机的入口状态和出口状态。对于一个不含嵌套结构的状态机,只能有一个初态,可以有一个或多个终态甚至没有终态。

 UML之状态机图_嵌套_02

状态一般由状态名称、子状态、入口动作和出口动作、内部执行活动、内部转换和可推迟事件组成。对于简单状态而言,不会有子状态。

状态名称:可以把一个状态与其他状态分别开来,即状态名称必须在当前层次内保持唯一。没有名称的状态被称为匿名状态。

入口动作与出口动作:由其它状态转移到当前状态或从当前状态转移到其它状态时要附带完成的动作。表示为“entry /动作表达式”和“exit /动作表达式”。

内部执行活动:当对象进入一个状态时,在执行完入口动作后就开始执行该活动。使用“do/活动表达式”来表示。

内部转换:指的是不导致状态改变的转换。内部转换只有源状态而没有目标状态。表示为“事件名称(事件参数)/活动表达式”。

可推迟事件:不会触发状态的转换,且当对象处于该状态时事件可能会被推迟,但不会丢失。格式为“事件名称/defer”。

 

 

转换

转换是两种状态间的一种关系。它指明当特定事件发生或特定条件满足时,处于某状态(源状态)的对象将执行某一动作或活动并进入另一状态(目标状态)。

转换表示为从源状态指向目标状态的实线箭头,并附有转换的标签。转换的标签格式如下:

 ⌊转换名称:⌋opt 事件名称opt ⌊(参数列表)⌋opt ⌊[监护条件]⌋opt ⌊/效果列表⌋opt

 

转换——转换名

转换名称是转换的标识符。在实际使用中,为了防止转换名称与转换的触发器或监护条件混淆,一般不必为转换命名。

对于一个转换,除了源状态、目标状态外,还要有事件、监护条件和效果列表等内容。这三个部分的内容对转换不是必需的,在使用时要根据转换所表达的具体语义来添加相应内容。

 

转换——事件

事件是在某一时间与空间下所发生的有意义的事情,是系统执行中发生的值得建模的事物。

事件一般被状态或转换所发送和接收。在转换中被接收的事件也被称为该转换的触发器或触发事件。

事件包含一个参数列表(可能为空),用于从事件的产生者向其接收者传递信息。

对应于触发器转换,没有明确的触发器的转换成为结束转换或无触发器转换,是在状态的内部活动执行完毕后隐式触发的。

能够在触发器中接收的事件有以下四种:

1)调用事件:调用事件表示对象接收到一个调用操作的请求。其期待的结果是事件的接收者触发一个转换并执行相应的操作。

2)改变事件:改变事件的发生依赖于事件中某个表达式所表达的布尔条件。改变事件没有参数,要一直等到条件被满足才能发生。

3)信号事件:信号由一个对象准确地送给另一个或一组对象。发送给一组对象的信号可能触发每个对象的不同转换。

4)时间事件:时间事件的发生依赖于事件中的一个时间表达式。比如,可以让对象进入某状态后经过一段给定的时间或到达某个绝对时间后发生该事件。

UML之状态机图_状态机_03

 

转换——监护条件

监护条件是一个转换被激发之前必须满足的一个条件。

监护条件是一个布尔表达式,可以根据触发器事件的参数、属性和状态机所描述的对象的链接等写成。当转换接收到触发事件后,只有监护条件为真,转换才能被激活。

对监护条件的检验是触发器计算过程的一部分,对于每个事件监护条件只检查一次。如果事件被处理时监护条件为假,那么除非再次接收到一个触发事件,将不会再重新计算监护条件的值。

 

转换——效果列表

效果列表是一个过程表达式,在转换被激活时执行,表示转换附加的效果。

效果列表包括多个动作,可以根据操作、属性、拥有对象的连接、触发器事件的参数等写成。动作可以是一个赋值语句、算术运算、发送事件、调用对象的属性或操作、创建或销毁对象等。

效果的表达语法与其实现的具体内容有关。

UML之状态机图_嵌套_04

 

 

例子(1):简单的状态机图—吃饭状态

做需求时,需要了解以下六种元素:起始、终止、现态、次态(目标状态)、动作、条件,我们就可以完成一个状态机图了

UML之状态机图_建模_05

①现态:是指当前所处的状态。

②条件:又称为“事件”,当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。

③动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。

④次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。

 

画状态机图的注意事项:

1、避免把某个“程序动作”当作是一种“状态”来处理。那么如何区分“动作”和“状态”?“动作”是不稳定的,即使没有条件的触发,“动作”一旦执行完毕就结束了;而“状态”是相对稳定的,如果没有外部条件的触发,一个状态会一直持续下去。

2、状态划分时漏掉一些状态,导致跳转逻辑不完整。所以在设计状态机时,我们需要反复的查看设计的状态图或者状态表,最终达到一种牢不可破的设计方案。

 

例子(2)需求岗工作状态

UML之状态机图_历史状态_06

 

 

伪状态

概念:伪状态指的是在状态机中具有状态的形式,却具有特殊行为的顶点。

  当一个伪状态处于活动时,系统不会处理事件,而是瞬间自动转换到另一个状态,并且这种转换是没有事件进行显式触发的。

最常见的伪状态包括初态、选择、分叉与结合、历史状态等。

  a.初态:初态实际上不是一个真正的状态,它更像是状态机的入口。初态的具体语义概念是模糊的且是瞬时的,不能存在触发器进行触发,否则对象将可能会长时间停留在一个语义不明的初态中。

  b.选择是状态机中的一个伪状态节点,用于表达状态机中的分支结构。

    一个选择节点将一个转换分割为两个片段,即将触发事件与监护条件分离。

    选择节点不同分支上的监护条件应该覆盖所有情况,否则状态机将不知道如何运行。

UML之状态机图_状态机_07

 

 

例子(3)订单状态机图

UML之状态机图_嵌套_08

 

 

 

复合状态

概念:复合状态是指包含有一个或多个嵌套状态机的状态。

a.顺序复合状态:当顺序复合状态被激活时,只有一个子状态会被激活。

b.并发复合状态:复合状态中包括两个或多个并发执行的子状态机。

在复合状态中,我们可以先将一部分细小的状态组合成一个状态机,把这个新的状态机作为总状态机图中的一个复合状态来呈现。

 

 

顺序复合状态

顺序复合状态又被称为非正交状态,是仅含一个状态机的复合状态。

当顺序复合状态被激活时,只有一个子状态会被激活。它只增加了一层子结构,没有增加额外的并发性。

 UML之状态机图_触发器_09

 

 

并发复合状态

并发复合状态,也称正交复合状态,是包括两个或多个并发执行的子状态机的复合状态。

并发复合状态将复合状态分成若干个正交区域,每个区域都有一个相对独立的子状态机。如果该并发复合状态是激活的,那么该状态中每个区域都将有一个状态是激活的。

 UML之状态机图_状态机_10

 

 

历史状态

历史状态是应用于复合状态的一种伪状态,它代表上次离开该复合状态时的最后一个子状态。

当一个来自于复合状态外的转换为复合状态内的历史状态时,将使历史状态所记录的子状态被激活。

深历史状态保存的更深的嵌套层次中的子状态。

 UML之状态机图_建模_11

 

 

状态机图的建模技术

为对象的生命周期建模

  确定状态机的语境。

  设置状态机的初态和终态。

  决定该对象的状态机中可能需要响应的事件。

  从初态到终态,列出这个对象可能处于的所有顶层状态。用转移将这些状态连接起来,明确转移的触发器和监护条件,接着向转移中添加效果动作。

  识别状态是否需要有入口动作和出口动作。

  如果需要,使用子状态来对顶层状态进行嵌套。

  检查状态机中提供的事件是否与所期望的相匹配;检查所有事件是否都已经被状态机所处理。

  检查状态机中的动作是否能由类或对象的关系、操作等支持。

  跟踪状态机,确保状态机是良构的,即不存在无法到达的状态,也不会发生停机。

 

 

例子(4)音乐播放

 UML之状态机图_嵌套_12

 

例子(5)取消航班

UML之状态机图_状态机_13

 

例子(6)系统进程状态机图

 UML之状态机图_嵌套_14

 

 

案例

新生入学后,学校在三个月内按照国家招生规定对其进行复查。复查合格者予以注册,取得学籍。复查不合格者,学校区别情况予以处理,直至取消入学资格。

学生有如下情况之一者,应予休学:

      (一)因伤病经学校指定医院诊断,须停课治疗、休养一学期1/3时间;

      (二)一学期请假缺课超过该学期总学时的1/3;

      (三)传染性肝炎、肺结核等传染性疾病;

      (四)因某种特殊原因,学校认为必须休学。

学生休学至少一学期,一般以一年为限。学生复学后,休学之前已记入成绩档案的考核成绩继续有效,并作为学籍处理依据.

学生复学按下列规定办理:

     (一)学生因伤病休学申请复学时,须持有二级甲等以上医院诊断书,证明身体健康,并经学校指定医院复查合格,方可复学;

    (二)学生休学期满后应于学期的注册期内持有关证明,经教务处核准后编入原专业相应班级选课学习;

 学生有下列情况之一者,应予退学:

(一)学生在读期间,3次出现在一学期中取得的课程学分不足10学分(不含重修和补考学分;毕业学期除外;第一次提出警告,第二次提出退学警告,由教务处公布名单,院系负责通知学生家长);

(二)休学、保留学籍期满,在规定期限内不办理复学手续;

(三)休学累计满二年,经复查不合格;

(四)因伤病需要休学,经学校动员后仍不办理休学手续;

(五)经学校指定医院确诊患有疾病,或意外伤残无法继续在校学习;

(六)未请假离校连续2周末参加学校规定的教学活动;

 (七) 超过学校规定期限未注册而又无正当事由;

(八)本人要求退学。

     学生在规定的学习年限(4年制3~6年,5年制4~7年)内修完本专业培养计划规定的全部教学环节,取得注册专业规定的毕业学分,准予毕业,发给毕业证书。

 

UML之状态机图_嵌套_15

                状态机图