4. 1 基于交互的对象行为建模:交互时的行为顺序
用例实现( Use Case Realization) 的第一步是发现用例中的对象 ,用例实现的第二步是确定所有对象的应有行为(或责任)。为了确定每个对象的行为 ,首先要分析用例中对象之间的交互作用(Interaction) 。
以PPS 项目中的用例创建销售订货单为例,用 UML的顺序图(Sequence Diagram)来描述在创建销售订货单用例中对象之间的相互作用关系,如图 4-1 所示。在需求分析的初期,为了分析系统的行为 ,可以把创建销售订货单简单地看成是销售员Salesmen与系统SalesSystem两个对象之间的相互作用,销售员要求系统创建新的订货单,然后销售员填写有关客户、产品等信息, 最后销售员向系统提交订货单。通过对 象交互图可以一目了然地确定Sales System的三个主要行为是:创建订货单、填写订货单详细信息提 交订货单 。

交互图( Interaction D ia g ra m ) 为基于交互的对象行为建 模,是 U M L 用于描述对象之间信息 的交互过程的方法 ,是描述对象间协作关系的 模型。交互图指出对象 如何通过 协作来完成用 例中捕获的业务流程。交互图中的对象可能代表的是一个子系统、一个构件或一个类的对象。
UML 有 两 种 表 达 形 式的 交 互 图: 顺 序 图( Seq ue nce Diag ra m ) 和 通 信 图( Co m mun ica t io n D i a g ra m ) 。它们均可以完整地表达对象之间信息的交互过程 ,但是由于它们所采用的表达方式不同 ,它们的关注点有所不同。如果按时间顺序对消息的交互过程建模,则使用顺序圖 ,它展示的是按時間順序發生的消息 傳送。如果按對象關聯對消息的交互過程建模,則使用通信圖 ,通信圖強調的是消息交 互傳遞中對象之間的關聯。本章介紹的是顺序图,顺序图为交互时对象的行为顺序建模,第 5章将介绍通信图
4.2 顺 序 图
顺序图用于捕获系统运行中对象之间有顺序的交互,强调的是消息交互的时间顺序。顺序图描述了对象实现全部或部分系统功能的行为模型。顺序图由生命线和消息组成
4.3 顺序图的表示方法
4.3.1 生命线
每个参与者及系统运行中的对象都用一条垂直的生命线( Lifeline ) 表示。生命线展示了一个对象在交互过程中的 生命期限 ,表示一个对象 在系统表 现一个功能时的 存在时间 。UML用矩形框和虚线表示生命线,矩形框中添加生命线的名称,虚线展示了参与交互的 对象的生命长度 ,生命线的表示方 法如图 4- 2所示。

在矩形框中添加生命线的描述标签,可以使用下面的语法,注意语法中的各个部 分都用斜体表示 ,说明它们都是可选的部分 。

object _ na me 是生命线对象的名字,由于同一个类的对象 可以有不同的状态值, 所以有时需 要识别每个对象个体,这时可以在 se l e cto r 中标明。Class _ name 说明了参与协作的对象的类型。ref 是引用( Re fe rence ) 的英文缩写 ,deco mpos i tio n 也是个可选的部分,它指明在另一个更详细的顺 序图中展示了当前交互的参与者如何处 理它所 接收到的消息的 细节。下面给出生命 线的一些示例。
在图 4-3 中类名是 Sa le ,生命 线指的是 Sa le 的对象 ,但是没有给出具 体对象的名字,这里是用:C lass nam e的形式表达的。
在图 4-4 中,指出 Sa le 的对象名字是 s l ,这里是按o bjec t _ na me: Class _ nam e的形式表达的。

在图 4- 5 中,用 i 表示一组S a le的对 象 中 第 i个对象。

在图 4- 6 中 ,re f C o m S a le 表示 C o m S a le 将 在其他的顺序图中给出详细描述。

4.3.2 活动条
在生命线的虚线上可以用活动条表示某种行为的开始和结束。
活动条( A ct i va t io nBa r) 也称为执行发生( E xecut io n O cc urr e nce ) ,它 用 来表示对象的某个行为所处的执行状态,活动条用小矩形条表示,图 4- 7 是一个带活动条的顺序图的例子。但是,这里要强调的是在生命线上并非一定要用活动条来表示执行的发 生,活动条的 加入使得执行发生更形象化,但是在行为繁多的顺序图中,活动条也使图 示更复杂 ,所以,在这种情况下,倾向不使用活动条。

4.3.3 消息
1. 什么是消息
在面向对象的分析和设计中,对 象的行为也称为消息( M es s ag e ) ,因为对象之间行为的交互作用也可以看成是对象之间发送消息实现的。通常,当 一个对象调用另一个对象中的行为时,即完成了一次消息传递。由于顺序图强调的是对象行为的发生顺序,所以 ,也可以说是消息发生的时间顺序。
顺序图关注生命线间的通信,这些通信就是对象发送的消息。UML用生命线间带有实心箭头的实线表示消息,每条 消息从发送对象指向接收对象。如图 4-7中 , getTotalPayment、getPrice都是简单地表达消息的例子。
顺序图帮助发现系统中应该有多少个对象以及每个消息应该屈于哪个对象。在 图 4-7中 ,对象 anO rder向类 Product的对象发送了消息 getPrice,消 息 g etPrice属 于类 Product的对象。同样,消息 getTota!Payment为对象 anOrder 所有,并在消息gctTotalP ayment中,对象 anOrder调用了 Product的对象的消息 getPrice。 下面的程序说明了这个问 题。

2 . 消息的 命名
每一个消息都必须命 名。在表达消息 的箭头上,放置表示 消息名称的标签,其语法如下:

其中,attribute 展示了消息的返回值将被存储于发送消息方的属性中,这些属性可能是发送消息的对象的某个属性、参与交互的全局属性或者参与交互的类的实例的 属性。signal_or_ message_na me指明了消息的名字。para meter指消息的参数, parameterType是这个参数的类型,parameter:parame terType指明了消息的参数列表,各参数间用逗号相隔。return_value指明了消息的返回值。表4-1 是根据上述语法给出消息的一些例子。


3. 简单消息、同步消息和异步消息
消息分为简单消息(Si mpl e M essa ge ) 、同步消息 (Synchro nous Mess age) 和异步消息( As ynch ro no us Mes sag e) 。
简单消息只表示控制如何从一个对象发给另一个对象 ,并 不包含控制的细节。同步意味着阻塞和等待,如果 对象 A 向对象 B 发送一个消息 ,对象 A 发出消息后必须等待消息返回,只 有当对象 B 处理 消息的操作执行完毕后, 对象 A 才可继续执行自己的操作,这样的消息称为同步消息。异步意味着非阻塞,如果对象 A 向 对 象 B 发送一个消息,对象 A 不必等待对象 B 执行完这个消息,就可以继续执行自己的下一个行为 ,这样的消息称为异步消息。
UML 用实体箭头表示同步消息,称 为 Fi I led A rro w ,图 4- 7 中 ge tT o ta l P ayment和 get P ri ce都是同步消息。
![]()
用开放式箭头表示异步消息,称为 Open A rro w , 图 4-8 中 se tP rice 就是一个异步消息。

4. 对象创建消息
参与交互的对象不必在整个顺序图交互的完整周期中一直存在,可以根据需要, 通过发送消息来创建 和销毁它们。创建对象的消息被称为对象创建消息 ( Object CreationMessage) ,表示对象在交互过程中被创建,通过构造型 << create > > 来表示。
图 4 - 9 为创建用户新账户的例子。

下例为图 4- 9 对应的一段简单的 J a va 代码。

也 可以用如图 4-10 所示的方法来表示创建对象消息,即 消息的箭头直接指向被创建对象生命线的头部。这样就不需要图 4- 9 中的构造型< < cr ea t e > > 了 。

5.对象销毁消息
— 个对象可以通过对象销毁消息( ObjectDestructionMessage ) 销毁另一 个对象, 当然,它 也 可以销毁它本身。UML将构造型< < destroy> > 作 为消息的标签来表达对象销毁消息 ,同时在对象生 命线的结束部分画一个“ X ” 来表示该对象被销毁了。图 4-11 是一个对象 销毁消息的例子。

在 J ava 中,使用垃圾 回收机制来处 理对象的 销毁 。
6. 无触发 对象和无接收对象消息
无触发对象消息称为 fo u n d m e s s a g e , 用活动 条开始 端点上的实心球加箭头来表示,它表示消息的发送者没有被详细指明 ,或者是一个未知的发送者,或者该 消息来自于一个随机的消息源。
无接收对象 消息称为 lo s t m e s s a g e ,用箭头加实心球来表示,它描述消息的接收者没有被详 细指明 ,或者是 一个未知的接收者,或者该 消息在某一时刻未被收到。
这两类 消息的例子如图 4-1 2 所示。

7 . 自我调用消息
自我调用消息表示消息从一个对象发送到它本身,可以通过活动条的嵌套来表示 自我调用消息 ( CallSelfMessage ) 。图 4-13 中 ,消息 getDiscount就是一个自我调用消息的例子。

8.控制信息
下面两种情况可以应用控制信息( Co nt rol I nfo rm a t io n) 表达。
(1 ) 条件( Co nditio n) : 仅当条件为真的时候消息才被发送。其语法为:

其中,条件表达式放置在[ express io n] 中。图 4-13 中,消息[ price> 100] getDisco unt()
就是表达条件的控制消息的例子。
(2 ) 迭代 Cl tera tio n ) : 为了接收多次对象消息被发送多次。其语法为:

“ * ” 表示这是一个迭代,迭代条件放在[ express io n] 中。 图 4-1 4 给出了这种类型的控制消息的例子,它 表 示 H uma n Reso ur ce 将 反复向 Sal e De par tment 发送消息addSa l es man 直 到条件表达式 u nt il f u ll 为真。

9.消息的返回值
消息的返回值( R e t u rn V a l ue ) 可以用虚线加开箭头的形式表示,有两种方法来表达一个消息的返回值:

但是,很多情况下 ,人们习惯省略消息的返回值。
4.3.4 交互框
UML 2.0 在顺序图中加了交互框( I n te ract io n F ra m e ) 。 交互框指图中的一块区域( R eg io n ) 或片段 ( F ra g m e n t ) , F ra m es 包含一个操作符 ( O pe ra to r ) ,或称标签C L a be l ) ,并 且包含一个警戒( G ua rd ) 。表 4- 2 是关于 F ra m e 操作符的说明。


下面举例说明主要的交互片段。
1. alt
操作符 a lt 的 例 子如图 4-16所示。
如图 4- 16 所示的顺序图可以这样理解。
(l) 消息getPrice 被发送给SaleManagement,然后根据q uantity的值进行选择判断。
( 2 ) 如果 q ua n t it y 的值小千 M i ni A m o u nt ,那么 S a le M a nag e m e n t 将向 R etail 发送消息 g e tP r i ce 。
( 3) 否 则 ,Sa leManagement将向 WholeSale发送消息 getP rice。

2 . loop
Frame 操作符loo p 的 例子如图 4-1 7 所示。

如图 4- 1 7 所示的顺序图可以这样理解:
(l ) 消息 g e t P ro d u c t s 被发送给实例O rde r , O rd e r 判断 I 的 值 是 否 小 千 n。
( 2 ) 当表达式 飞=n 的值为真的时候,实例 O rd er 向实例 P ro duc t M g t 发送消息
g e t P r o d u c t Na m e 和 g e t Product D a ta。
3. opt
F r a m e 操作符 o pt 的例子如图 4-18 所示。

如图 4-18所示的顺序图可以这样理解: 当表达式 inventory- order' snumber < = productLevel的 值 为 真的 时 候,对 象 : ProducePlanMgt分 别 向: ProducePlan和
: S to ra g e 发送消息 s e t P ro d uct 和s e t P ro d uct Num be r。
4. par
F ra m e 操作符 p a r 的例子如图 4-19 所示。

图 4-19 的顺序图可以理解为 sa ve Us e rDat a( ) 和 chec kQ ualif i c a t io n()将并行执行
4.3 案 例 分 析
现在巳经掌握了顺序图中的基本 UML 元素,是时 候 看 看 如何 应用顺序图表示用例中对象的交互了。以 PPS 项目中创建生产计划单用例为例。用例创建生产计划单的主要场景如表4-3 所示。

经过分析 ,在用例创建生产计 划单中,不 难 发现对象生产计划单、订货 单、产品和库存。这些对象是如何协作实现用例的呢?图 4 - 20 是为这个用例创建的顺序图。
从上面的例子中可以看出,顺 序图将交互关系表示为一张二维图,从上到下体现了时间顺序轴,从左到右代表了参与交互的对象。

4. 5 总 结
本章介绍了 交互图的一种: 顺序图,详 细说明 了绘制顺序图的目的和顺序图的绘制方法,并以创建生产计划单为例,给出了用例创建生产计划单的顺序图。Booch、Rumbaugh和 Jacobson在著作 The Unified Modeling Language User Guide中指出了顺序图的绘制策略,总结起来,这些策略包括:
(1 ) 先确定交互发生的语境,即交互 是发生在系 统中、子系统中、操作中、类中还是用例或协作中。
(2 ) 通过识别对象在交互 中扮演的 角色设置交互 的场景,将这些 对象从左到右地放在顺 序图的 上方 ,较重要的 对象放 在左边,与它们关联的其他对象 放在右边。
( 3 ) 在适当的时刻为每个对象设置生命线,多 数情况下 ,对象存在于整个交互过程中,对千那些在交互期间创建和撤销的对象,用适当的构造型显示指明它们的创建 和销毁 。
( 4 ) 从引发交互 的消息开始,在生命线之间自上 而下 画出依次展开的消息 ,显示每个消息的特性(如消息的参数),如果需要,解释交互 的语义。
( 5) 如果需要可视化消息的嵌套,或可视化实际计算发生时的时间点,则用激活条修饰每个对象的 生命线。
(6) 如果需要更形式化地说明控制流,可以为消息附上前置或后置条件。
为一个简单的系统建模,使用顺 序图的控制机制就足够了,但当给一个复杂的场景( Sce na rio ) 建模时,则需要绘制多个顺序图。另外,顺序图 不适于为一个详细的算法建模 ,这种情况更 好的方法是使 用活动图 和状态图。


