7. 1 基千状态的对象行为建模
在PPS项目中,创建生产计划单时,计划员将根据预计可用库存量来决定下一步的操作。如果库存量小于最低库存域值,系统生成采购预警,采购员创建零配件采购合同;否则 ,采购员将设定产品预计交货日期。这两个行为的选择都是由库存的状态决定的。再考虑PPS项目的订单,只有审核过的订单才能列入生产计划。订单具有两个状态:未审核和已审核。订单是否将列入生产计划将由其状态决定。对象既有行为又有状态,对象的行为由其状态决定,对象根据其状态的不同而产生不同的行为。为了描述对象在状态转变过程中将产生什么行为,需要捕获对象所有可能发生的状态。
仅依靠顺序图或通信图来建立对象的行为模型还不够,还需要全面地分析该对象 所有可能的状态以及从一个状态过渡到另一个状态的条件。UML的状态图 ( State Diagram ) 特别适合为那些行为由其状态决定的对象建模,它 描 述 了 一 个对象可能处于的各种不同状态以及这些状态之间的转移。因此,U M L的状态图是有效的基于对象状态的行为建模工具。
7.2 状 态 图
状态图由状态( S ta te) 和迁移( T ra ns it io n) 组成。它的表达方式为:

7.3 状态图的表示方法
先用一个简单的例子说明状态图的关键元素。图 7-1 展示了为 PPS 系统创建用户申请的 状 态图。 在申请的过 程 中,账 户可能出现 4 种 状态: 悬而未决状态( pend in g ) ; 如果账户申请被接受,则 会 处 于接受状态( appro ved ) ; 如果账户申请被拒绝,则 会处千拒绝状态( reje ct ed ) ; 但是,不 论 此次申请被拒绝或接受,账 户的申请都将完成,处 于完成状态(f i na l izi ng ) 。这 4 种状态最终通过它们之间的迁移连接起来

7.3.1 状态
状态是对象在它的生命周期中的某一时刻,对象 不仅在这一时刻具有某些特殊条件下产生的状况值 ,而且具有该状态决定的相应的动作或活动。UML 用圆角矩形来表示状态,其 中 包 含可选的名称,如图 7- 1所示的状态有 pending、approved、rejected 和finalizing。 需 要注意的是 ,在定义状态时,只关 注与状态值相关的对象属性,基 于状态建模的目标是将该属性所有可能发生的状态和状态之间转换的链接组合在一起, 以便 展现对象在该属性不同状态下的行为全貌。
1. 状态的 种类
根据状态发生的时间或状态组成的复杂性,可简单地对状态进行分类。表 7- 1 是状态图中常用的几种状态类型及它们的描述和表示符号。

图 7- 2和图 7- 3是两个复合状态的例子。图 7- 2 表示Check ing 状态有一组子状态图,则 在 Checking 状态图内包含另一个状态图;图 7- 3 表示 Checking 状 态有多个子状态图,则用 虚线将 Checking状态图分开。


2. 状态内部的活动
状态的内部活动(InternalActivity) 表示在特定状态下对象可执行的功能。一个状态可以有若干相关活动,这些活动可以是由状态内部的事件触发的内部活动,也可 能是由迁移的开始或结束自动触发的活动。无论是内部还是外部活动,只有当状态处 千激活时活动才被触发。这些活动可以是操作、属性或者任何触发事件的参数,它可能 是产生诸如发送信号或调用某个操作,包括 给另一个对象发送消息、创建和销毁对象等。
应用标签表示状态的内部活动,一 个 活动可以采用下面的形式描述,并 放 置在表示状态的圆角矩形中

UML 提供了三种标签来表示下列活动: 开始进入状态时自动触发的活动、内部事件触发的活动和状态结束时自动触发的活动。分别用下面的标签表示。
(1) entry , 当进入一个状态的时候被自动触发,该活动在状态中其他任何活动之前被自动触发。
(2) do : 当状态处于激活时执行 do活动,do活动在进入活动之后执行,并且 一 直运行到它本身完成为止。
(3) exit:当 离 开一个状态的时候被自动触发,该活动在该状态结束之前、所有其他活动都完成后被触发。
图7-4.给出了一个带有活动的状态的例子

7.3.1 迁移
迁移指从一个状态到另一个状态的瞬间变化过程。从源状态到目标状态一发生 变化,就称发生了迁移。UM L 用从源状态到目标状态的带开放式箭头的实线表示迁移,箭头指向目标状态,如图 7-1中各状态间带箭头的线。
1.引发迁移的事件
迁移的发生可能被来自对象内部或外部的各种事件所引发。如果某一事件的发生引起了对象状态的变化,即称 对 象 的 状 态发生了迁移。这些可能引发迁移的事件可以进一步划分为:信 号 事件、变化事件、调用事件、时间事件等。
l ) 信号事件
信号事件( S ig na l E ve n t ) 指在实时( R ea l- t i m e ) 系统运行中,对象 接收到一个系统外界的信号,从而使对象的状态发生迁移的事件。例如,当打开灯时,把系统外界压力信号通过开关传入系统,同时系统状态发生由熄灯到亮灯的状态迁移。
2) 变化事件
变化事件( C ha ng e E ve nt ) 指对象的内部或外部条件发生变化而引起的对象状态发生变化的事件。例如,对象 在实行某个行为时,当 某个条件是 t r ue 时,则 必 须 改变其自身或所关联对象的状态,这个布尔条件就是变化条件。
3) 时间事件
时间事件( T im e E ve nt ) 指对象的状态在绝对时间上或某个时间段内自动发生迁移。时间事件经常由系统外界设定的时间或系统内部设定的时间段产生,其时间表的 运行可能来源千操作系统,或者是系统应用中的自身 运算。例如,一个在校学生的有效学生身份状态可能由于学校管理系统的日期变化而自动变成非学生状态。
4) 调用事件
调用事件( Ca ll E ve nt ) 是指系统之外的其他系统通过接口和某种协议,直接执行该系统内部的对象行为 ,从而引 发对象状态的迁移。例如,用 办 公 室计算机远程遥控家里的各种电器,使电器发生状态迁移。
2. 迁移的 文字标签
为了使迁移线有明确的意义 ,UML 提供了由三部分组成的文字标签来解释该迁移的发生事件。这三部分是: 触 发、警戒条件和行为。文字标签的语法可以 表示为:

下面给出标签上各个元素的解释。
1) tngger
trig g e r 表示触发,指明何种条件可以导致迁移发生。如图7-5 中的 k e ys t ro k e 就是一个触发。
2) g uard
g ua rd 表示警戒条件,指为了让警戒发生而必须为真的布尔表达式。当事件发生时,警戒 条 件 就会触发。警戒条件只在事件发生的时候检查一次 ,条件为真时,迁移才触发。它表达的语义是 ,如“当… … 的时候(事件),如果……(条件),那么 … …(下 一个状态)” 。 值 得 注意的是,警 戒 条件要么不写,如果写,则 只 有条件为真时才会被触发。如图7-2 中的 i n put = r eq uired_ l e ng th 表示的就是一个警戒条件。
注意警戒条件与变化事件的区别。警戒条件只是在引起转换的触发器事件触发时和事件接收者对事件进行处理时被赋值一次。如果它为假,那么转换将不会被触发,条件 也 不 会被再赋值。而变化事件被多次赋值直到条件为真,这时转换也会被触发。
2) behavior
be ha vio r 指为响应事件而执行的行为,迁移行为指当迁移发生时所执行的一个不可中断的活动( A ct i vit y ) 。 如图 7-5 中的 s u bm it inpu t 表示的是一个行为。
7. 4 案 例 分 析
下面举一些例子说明状态图的应用。
经常用堆栈这一数据结构存储对象,图 7- 6 展示了一个堆栈类的类图,称 它 为S ta ck。

St ac k 类具有的性质包括:它 当前只能检索到最后存储的对象(后进先出),这个过程称为出栈( P opped ) ; 可以说 S tack 类为空,表示 S tack 类还没有任何对象;它 有一个最大值,表 示它最多能存储的对象的个数;它 有一个栈顶( T o p) ,用 于 表示下一个将被添加的元素的位置。与它对应的状态图如图 7- 7 所示。

7.5 总结
现在应该对状态图的应用目的和描述方法有了了解,状态图最重要的两个元素是 状态和迁移。如果需要更深入地研究一个对象或系统的状态时,无非是在这两个重要 元素的基础上更深入地分解细化状态和迁移事件。
通常,状态图用于描述一个对象的多种状态在所有可能的 迁移下的相互转换过程。状态图是把对象的某个属性的状态从 复杂的对象行为中分离出来进行独立的考察。状态图虽然精确地描述了对象在不同状态下的复杂行为,但是它仅仅是描述一个 对象的多种状态,这使得在理解对象的所有行为时造成局限性,所以,要确定对象的整体行为必须同时结合顺序图和通信图建模。也就是说,状态图更适用于描述一个横跨多个用例对象的行为,而不适千描述包括多个对象间协作的行为。不要试图为系统中 的每个对象绘制状态图,只为一些具有复杂状态的对象建立状态图就足够了,它将 有助于理解什么正在进行着。

