Page 1 ?
UML及软件建模
主讲人, 李 唯
clx7000@163.com
Page 2 ?
第七章 状态图
什么是状态图,如何使用它
如何使用事件,动作和保护条件
如何对子状态,历史状态和连接点建模
Page 3 ?
1、概述
状态视图通过对类对象的生存周期建立模型来描述对象随时间变化的动
态行为。每一个对象都被看作是通过对事件进行探测并做出回应来与外
界其他部分通信的独立的实体。
事件表示对象可以探测到的事物的一种运动变化 — 如接受到从一个对象
到另一个对象的调用或信号、某些值的改变或一个时间段的终结。任何
影响对象的事物都可以是事件,真实世界所发生的事物的模型通过从外
部世界到系统的信号来建造的。
状态是给定类的对象的一组属性值,这组属性值对所发生的事件具有相同
性质的反应。换而言之,处于相同状态的对象对同一事件具有同样方式
的反应,所以当给定状态下的多个对象当接受到相同事件时会执行相同
的动作,然而处于不同状态下的对象会通过不同的动作对同一事件做出
不同的反应。例如,当自动答复机处于处理事务状态或空闲状态时会对
取消键做出不同的反应。
Page 4 ?
状态用于描述类的行为,但它们也描述用例、协作和方法的动态行为。对
这些对象方面而言,一个状态代表了执行中的一步。我们通常用类和对象
来描述状态,但是它也可以被其他元素所直接应用。
状态描述了一个类对象生命期中的一个时间段。它可以用三种附加方式说
明:在某些方面性质相似的一组对象值;一个对象等待一些事件发生时的
一段时间;对象执行持续活动时的一段时间。虽然状态通常是匿名的并仅
用处于该状态时对象进行的活动描述,但它也可以有名字。
在状态机中,一组状态由转换相连接。虽然转换连接着两个状态(或多个
状态,如果图中含有分支和结合控制),但转换只由转换出发的状态处理
。当对象处于某种状态时,它对触发状态转换的触发器事件很敏感。
状态用具有圆形拐角的矩形表示。如图所示。
Initialization
Page 5 ?
Initialization
状态间带箭头的实线代表状态的迁移,箭头指向目标状态。
图中的实心圆代表状态转移的起点,带圆圈的实心圆代表终
点。
Canceled
Page 6 ?
2、在状态图中增加细节
UML中提供了在状态图中增加细节的选项。可以把状态图标
分成两个区域。最上面的区域保存状态名(必要),下面的区
域保存在该状态中发生的活动。如下图所示:
Initialization
Do/ Initialize course
常见的三个活动是:
1、入口动作( entry ),进入某一状态时执行的动作。
2、动作( do):系统处于该状态时要发生的动作。
3、出口动作 ( exit ):离开某一状态时执行的动作 。
Page 7 ?
状态图中增加细节示例图
Faxing
entry/输入传真号
do/逐页传真
exit/完成传送
do/传真纸进入
Page 8 ?
3、触发器事件 ( trigger event
)触发器事件 是引起转换的事件。事件可以有参数,以供转换
的动作使用。
添加的事件和动作写在转移线上。
有时候一个事件会引起没有相关动作的状态转移,或者有时
一个转移是由于某个状态完成了它的活动所引起(而不是由
于事件引起)。这种类型的状态转移被称为无触发器转移(
trigglerless transition)。
初始化
关机中
Do/启动
关机打开计算机 工作
Page 9 ?
转换可能具有一个 保 护条件,保 护条件是一个布尔表达式。 保 护条件可以引
用对象的属性值和触发事件的参数。当一个触发器事件被触发时,监护条件
被赋值。如果布尔表达式的值为“真”,那么触发事件即,使转换有效。如
果布尔表达式的值为“假”,则不会引起转换。 保 护条件只能在触发事件发
生时被赋值一次。如果在转换发生后 保 护条件由原来的“假”变为“真”,
则因为赋值太迟而不能触发转换。
从一个状态引出的多个转换可以有同样的触发器事件,但是每个转换必须具
有不同的 保 护条件。当其中一个 保 护条件满足时,触发器事件会引起相应的
转换。通常,保 护条件的设置要考虑到各种可能的情况以确保一个触发器事
件的发生应该能够引起某些转换。如果有些情况没有考虑到,一个触发器事
件没有引起任何转换,那么在状态机视图中要忽略这个事件。一个事件的发
生只能同时引起一个转换(在一个控制线程中)。如果一个事件可能引起多
个转换,那么其中只有一个转换有效。如果两个相互矛盾的转换同时有效,
则无法确定到底发生了哪个转换。这两个转换随机地发生一个,或者由系统
的实现细节决定究竟发生哪一个,但是对建模者来说,无法预料这种转换产
生的后果。
4、增加转移的细节:保护条件
Page 10 ?
保护条件示例图
初始化
关机中
Do/启动
关机打开计算机 工作
屏幕
保护
设定
时间
键盘或
鼠标
移动
Page 11 ?
5、子状态( substate)
某些状态存在于单个状态之中,因此它们被称为子状态。子状态以两种
形式出现,顺序子状态 和 并发子状态 。
5.2、组成状态
5.1、子状态
一个简单状态没有子结构,只带有一组转换和可能的入口和出口动作。
组成状态是一个被分解成顺序的或并发的子状态的状态 。
将状态分解成互斥的子状态是对状态的一种专门化处理。
Page 12 ?
5.3、顺序子状态( sequential substate)
正如其名字一样,顺序子状态按照顺序一个接着一个出现。
重新分析前面提到的,工作” 状态,可以有如下图:
等待用
户输入 验证用户输入
登记用
户输入
用户输入
工作
Page 13 ?
5.4、并发子状态( concurrent substate)
子状态是在同时执行的状态是并发状态。
并发状态之间用虚线隔开。
等待用
户输入 验证用户输入
登记用
户输入
[间隔时间 ]
工作
更新时
间显示
系统
时钟
用户输入
Page 14 ?
Page 15 ?
Copyright ? 1997 by Rational Software Corporation
6、几个状态图示例
Initialization Open
Entry/ Register student
Exit/ Increment count
Closed
Canceled
Do/ Initialize course
Do/ Finalize course
Do/ Notify registered students
Add Student /
Set count = 0
Add student[ count < 10 ]
[ count = 10 ]
Cancel
Cancel
Cancel
6.1、课程登记状态图
Page 16 ?
A vailab le L o c k e d So ld
初始状态
assi gne d t o
subsc r ipt ion
lo c k
t im e o ut
unl o c k
b uy
状态
e xc han ge
转换
触发器事件
6.2、售票状态图
Page 17 ?
初始状态是 Available状态。在票开始对外出售前,一部分票是给预约者
预留的。当顾客预定票,被预定的票首先处于锁定状态,此时顾客仍有
是否确实要买这张票的选择权,故这张要票可能出售给顾客也可能因为
顾客不要这张票而解除锁定状态。如果超过了指定的期限顾客仍未做出
选择,此票被自动解除锁定状态。预约者也可以换其他演出的票,如果
这样的话,最初预约票也可以对外出售。
6.2.1、售票状态图说明
Page 18 ?
? 系统中的对象改变自身的状态以响应事件和时间的流逝。 UML状态图就能捕获这些状态变化状态图的焦点就是一个对象状态的变化。
? 状态用一个圆角矩形表示,状态转移用带箭头的实线表示,它指向目标状态。
? 状态图标中要写明状态名,并且可以包括状态变量和活动列表。
? 转移可能作为对触发器事件的响应而发生,并且需要一个活动;转移页可能因为状态中的活动完成而引起:这种方式发生的转移叫做无触
发器转移;转移还可能起因于一个特定条件的满总而引起。
? 有时候状态可以包含子状态,子状态可能是顺序的,也可能是并发的。包含子状态的状态被称为组成状态
? UML必须包括状态图,因为它能够帮助分析员、设计员和开发人员理
解系统中各个对象的行为。开发人员尤其应该知道对象是如何体现各自的行为的,因为他们要用软件实施这些行为。只实施对象的静态特
征是不够的:开发人员必须要让对象能够做一些事情。
7、小结