【学习小记】UML——状态机图

什么是状态机图?

UML状态机图同活动图一样,是动态视图的一种。

UML状态机图描述的是某个对象的状态和感兴趣的事件,以及对象响应该事件的行为。它描述的是“某个对象”,因此,一个状态机图中只能表示一个对象,而不是多个对象。状态图显示了该对象的生命周期,也即,对象经历的事件,对象的转换和对象在这些事件之间的状态。


几个概念的理解

状态:状态是指在对象生命周期中,满足某些条件、执行某些活动或者等待某些事件的一个条件和状况。换句话说就是,对象在事件发生之间某时刻所处的情形。

 比如,人是一个类,而你,我,他则是一个对象。坐着,躺着,饱的,饿的则是“你”的一种状态。

状态无关:若一个对象对某个事件的响应总是相同的,则认为此对象对于该事件状态无关

举个不算很恰当的例子,“你”是一个对象,“饱的”,“饿的”则是“你”的一种状态。对于事件“给一个发霉的面包”,不管你处于“饱的”还是“饿的”,你的响应都是“把它扔掉“。所以,你对”给一个发霉的面包“是状态无关的。

状态无关对象:若对于所有事件,对象的响应总是相同的,则该对象是一个状态无光对象

状态依赖对象:对事件的响应根据对象的状态或模式的不同而不同。

事件(event):指一件值得注意的事情的发生。

转换(transition):转换是两个状态之间的关系,表明当某事件发生时,对象从先前的状态转换到后来的状态。


状态图的表示

1、状态

      UML状态机图中的状态,以圆角方框表示,通常有状态名称,进入/退出活动,内部转换,子状态,延迟事件组成(后面介绍)。

      状态还包括初始状态(由实心黑圆点表示)和终止状态(由实心黑圆点外包一个圆圈表示)。

【学习小记】UML——状态机图_第1张图片


2、事件

      事件包含在转换中,见3、转换


3、转换

      转换涉及的内容包括:源状态、目标状态、触发事件(事件)、监护条件、动作,具体可以参看下图的例子。

【学习小记】UML——状态机图_第2张图片

1)源状态:受转换影响的状态。


2)目标状态:当转换完成之后对象所处的状态。

 *(在转换激活前,对象处于源状态,在转换激活之后,进入目标状态。)


3)触发事件

用来为转换定义一个事件,当源状态中的对象接收到这个事件时,会使转换被激活。当定义了监护条件时,还需要满足监护条件。

事件通常有以下几种类型:

a、调用事件表示语法:方法名(参数)

调用事件接收一个对象显示的同步调用请求。

b、改变事件表示语法:when(表达式)

改变事件是指依赖于指定属性值的布尔表达式得到满足,是一种一直等待直到特定条件被满足的声明方式。(留意:改变事件中的条件是一直计算直到布尔表达式为真为止)

c、信号事件:表达语法:信号名(参数)

信号是两个对象之间通信的媒介。信号事件接收对象间显示的、命名的异步通信。

d、时间事件:表示语法:after(时间)

 时间可以指定为绝对形式,如:after(11:00),也可以指定为相对形式,如:after(3 seconds)


4)监护条件

当对象接收到触发事件时,对监护条件(通常是一个布尔表达式)求值,值为真时,激活转换,否则转换不激活。注意,监护条件与之前提到的改变事件不一样,监护条件只在触发事件时才会计算一次,而改变事件是一直计算。


5)动作

当转换被激活后,若定了相应的动作,那么将执行这个动作。它可以是一个赋值语句,简单的算术运算,发送信号,调用操作,创建和销毁对象,读取和设置属性的指, 甚至是包含多个动作的活动。


转换的种类

1、外部转换

表示语法:事件(参数)[监护条件]/动作

对事件做出响应,引起状态变化或自身转换,同时引发一个特定动作,如果离开或进入状态,将引发进入转换和离开转换。

             【学习小记】UML——状态机图_第3张图片

2、内部转换

表示语法:event 事件(参数)[监护条件]/动作

对事件做出响应,并执行一个特定的活动,但并不引起状态变换或进入转换,离开转换。(用来处理一些不离开该状态的事件。注意与自身转换的区别。自身转换是先离开,再进入。)


3、进入转换

表示语法:entry/活动

当进入某一个状态时,执行相应的动作。


4、退出转换

表示语法: exit/活动

当离开某一个状态时,执行响应的动作。


活动和延迟事件

活动:

表示语法:do/动作名

当对象处于一个状态的同时,对象做着某些工作,并一直继续到被某个事件中端。

例如,你在用QQ登录的时候,你点一下登录按钮之后,头像移动到了对话框中间,后面有动画,这个动画就是一种活动。当对话框处于验证用户的状态时,就一直执行显示动画的动作,知道用户验证结束。


延迟事件:

表示语法:事件/defer

指该事件不会触发状态的转换,当对象处于该状态时,事件不会丢失,但会被延迟执行。

例如,当email程序正在发送第一封邮件时,用户下达发送第二封邮件的指令会被延迟,直到第一封邮件发送完成后,才发送第二封邮件。

转换的几个例子:

                                   【学习小记】UML——状态机图_第4张图片

如何绘制状态机图

      绘制状态机图的基本步骤为:

      1、寻找主要状态

      2、确定状态间的转换,可借助状态转换分析表

      3、细化状态内部的活动和转换

            根据需要添加内部转换、进入转换、退出转换以及相关的活动等。

      4、用复合状态来展开细节

      下面用一个例子来进行绘制过程的演示。


描述文档:

simple digital watch

   A simple digital watch has a display and two buttons to set it, the A buttonand the B button. The watch has two modes of operation, display time and set time. In the displaytime mode, hours and minutes are displayed, separated by a flashingcolon. 
    The set time mode has two sub-modes, set hours and set minutes. The A button isused to select modes. Each timeA is pressed, the mode advances in sequence: display, set hours,set minutes, display etc. Within the sub-modes, theB button is used to advance the hours or minutesonce each time it is pressed. Buttons must be released before they cangenerate another event.

要绘制这个watch的状态机图,按照以上的四个步骤:

1、寻找主要状态

      从文本描述中,可以发现以下状态:display_time,      set_time,      set_hour,      set_minute

      其中,set_time是一个复合状态,包含set_hour和set_minute两个子状态


2、确定状态间的转换

      由于状态数目少,可以利用转换分析表来确定状态间的转换。

      【学习小记】UML——状态机图_第5张图片

      根据这些转换,便可以绘制出如下的状态机图

      【学习小记】UML——状态机图_第6张图片

3、细化状态内部的活动与转换

      此步根据需要,对每个主要状态添加内部转换、进入转换、退出转换以及相 关的活动。

      1)display状态:

            该状态实现的是每次进入display状态后,就要显示当前的时间,因此需要添加一个进入转换,实现一进入该状态就显示时间。

      2)sethour状态和set minute状态:

            这两个状态要完成的动作类似,都是针对时间的某个单位进行设置。设置完成后,离开本状态需要对修改进行保存,否则对时间的设置都不能完成了。

            因此对这两个状态都要添加退出转换save_hour()和save_minute()。


4、使用复合状态来展开细节

       在步骤1分析中,set_hour和set_minute都是set_time的子状态,因此使用一个复合状态set_time来表示set_hour和set_minute两个子状态。


综合以上四个步骤,可绘制出如下状态机图:

【学习小记】UML——状态机图_第7张图片


到此,watch的状态机图就完成了。



说明:

1、若有错误或不合理的地方,欢迎评论指出,共同进步。

2、原创文章,转载请注明出处,谢谢。

3、参考书籍:《UML和模式应用》(第三版),《UML面向对象建模基础》


你可能感兴趣的:(学习小记)