5.1 基千交互的对象行为建模: 交互时的对象结构
在第 4章中 ,介绍了 UML交互图可以由两种 UML图来表示,即 顺 序图和通信图 ,本章将讨论通信图 ( Communication Diagram) ,它与顺序图一样 ,都 是 用 来描述对象之间的相互作用的建模工具,只不过通信图强调的是对象之间在交互作用时的关联。
![]()
通信图的消息发生顺序用图中的消息编号的方法来表示。在 PPS 项目的用例“创建生产计划单”中 ,即 在图 4- 20 中,用 顺 序图详细描述了对象交互中消息发生的时间顺序和逻辑,同样可以用通信图的方式来表达。图 5-1 是用例“创建生产计划单”的通信图 ,与图 4- 20 表达了同一个交互过程。

5. 2 通 信 图
在 UM L 1. X 中,通信图 被称为协作图( C o ll a b o r a t i o n D ia g ra m ) 。用 例 的 每个事件流都可以用通信图来描述。通信图中可以有对象、参与者、它们之间链接和交互的消息。
通信图描述参与一个交互的对象的链接,它强询发送和接收消息的对象之间的链接。通信图的表达方式为:

5.3 通信图的表示方法
5.3.1 交互的参与者
交互的参与者( P art i cip a nt ) 用 一 个对象符号表示,在矩形框中放置交互的参与者,显 示 交 互 的 参与 者 的 名 称 和 它 所 属 的 类。 如 图 5-1 中 的: O r der Mgt 和: ProducePlan等。在通信图中表示对象的方法与在对象图中表示对象的方法一致, 其语法均为:

注意 ,虽 然整个系统中可能有其他的对象 ,但只有涉及协作的对象才会 被表示出来。在通信图中可能出现4 类 对象:存 在于整个交互作用中的对象、在交互作用中创建的对象、在交互作用中销毁的对象、在交互作用中创建并销毁的对象。
5.3.2 链接
链接( Li nk ) 是两个对象间的连接路径,它 表示两个对象间的导航( Na vig a t io n ) 和可视性( V is i blity) ,沿着这条路径,消息 可以流动。U ML 用直线表示链接。一般情况下 ,一个链接就是一个关联的实例。在图 5-1 中,: P ro d uceP lan 和: S to rage 之间有一个链接—— 或称导航路径,沿 着这条路径,消息 addP ro d uctT oS tora g e 就可以传递。
5.3.3 消息
在通信图中,对象 间 的 消息( Message ) 用依附于链接的带标记的箭头和带顺序号的消息表达式表示。箭头表示消息的方向,
箭头通过消息名称及消息参数来标记。沿同一个链,可以显示许多消息,这些消息都有唯一的顺序号,可能发自不 同的方向。
顺序号常用在通信图中,因 为它们是说明消息相对顺序的唯一方法。图 5-1 中 1: createPla n、2 : set P rod u ce P la n 等都是消息的例子。
通信图中消息的类型也有很多种,下面逐一解释这些消息。
1. 自我委派消息
消息可 能 从 一 个 对象 发 送 到 它 自 身,这 样的 消息 被 称 为 自 我 委 派 ( se lf De leg a t i o n) 消息,如 图 5- 2 中的消息 1. may P r es er ve( ) 。

2 .
控制消息
控制消息( Co ntro l M essage ) 表示当控制条件为真的时候消息才会被发送。控制消息设置了可选定 的消息流,控制消息放置在顺序号的后面,控制 消息的控制条件用中括号括起。
图 5-3 的例子展示了控制消息对基千特定条件的消息发送的选择,它 表示当 1. 1 中控制条件 q ua n tit y< M in iA m o un t 为真的时候,S a le M a nag ement 将向 Reta il 发送消息 ge t P ri ce ( ) ,否 则,S a le M a nag eme nt 向W ho les ale 发送消息ge tP ric e O 。

3.嵌套消息和子消息
当一个消息导致了另一个消息被发送的时候,第二 个 消 息 被称为嵌套在第一个消息里。这样的消息被称为嵌套消息( N es t ed M es sage ) 。通信图用多级消息号的形式表示这种消息的嵌套。
在图 5-1的例子中,消息 1.1<< create > > 被嵌套在消息 1.createPlan 中 ,在返回消息 createPlan之前 ,: Pro ducePlanMgt先向: P ro ducePlan发 送消息< <create> >。因 此 ,消息 createPlan 被编号为 1,而嵌套消息 create被编号为 1.1。
消息 可 以 包 含 多 层 嵌 套,如 图 5-1 中 的 一 系列 消 息 2. s et P ro d uceP lan、2. 1 g etO rder 、 2. 1. 1 getP rod ucts 、 2. 1. 1. 1 get Na e 以 及 2. 1. 1. 2 getP ro d uctDa ta都是用嵌套消息的形式表达的。
4. 循环
在通信图中,循环用“*”号来表示,循环子句被放在顺序号的后面,表示循环将按 照给定的循环子句重复。如图5-4中消息 2. 1. 1. 1 * [i< n] getName就是一个表示循环的例子,其中,*[飞 n]表示消息 getName在 I小 于 n的时候将被重复发送。如果仅想表示循环,并不想 说 明 循 环的细节,则只 加“ *”号 就 可以了。

5. 并发消息
有的时候,几 个 消息需要被同时发送,这样的消息称 为并 发消息 ( Concurrent Message )。图 5-5 展示了一个并发消息的例子。

其中,消息 sa veU s erDataO , checkQ ua lific at io n()需要被同时发送,用编号1. l a 、1b表示
5. 4 案 例 分 析
下面,以 PPS 项目中创建生产计划单用例为例,讲述如何应用通信图表示对象的交互。
首先,通过用例分析交互的参与者,得 到如图 5-6 所示的创建生产计划单用例中各个交互的参与者。

然后,在有交互的参与者间根据发生的交互消息添加链接使它们彼此能够通信, 如 图 5-7所示。

最后,得 到如图5-1 所示相对完整的通信图模型。
5. 5 总 结
通信图说明对象之间如何通过互相发送消息实现通信,它 显 示了一系列的对象、这些对象之间的联系以及对象之间发送和接收的消息。
什么时候使用通信图比使用顺序图表示交互更好呢?
对于上面的问题 ,通过观察图 4- 20和图 5-1,你有什么答案? 一般地 ,我们认为,如果更关注消息调用的顺序,那么就使用顺序图,如果更关注交互参与者间的链接,就 使用通信图。通信图显示了系统中对象和对象之间的关联,而这种对象间的关联在顺序图中是无法直接表示的。
通信图特别适合用来描述少址对象之间的简单交互,易 于展示对象之间是如何连接到一起的 ,但是却使我们很难一眼就看出交互中消息的发生顺序。随着对象和消息数批的增多,理 解通信图将越来越困难。此外,通信图很难显示补充的说明性信息 ,例如时间、判定点以及不同种类的消息等,例如,顺序图支持对异步消息的特殊表示方法(开箭头)。但是,在通信图中 ,并没有同步和异步消息之间的差别进行区分。所以,在顺序图中这些信息可以在通信图中方便地添加到注释中。
总之,顺 序图和通信图建模中所表达的交互模型是完全一致的 ,它们只是从不同的角度表达了系统中的交互,二 者是可以互相转换的,Rat i onal Ro se 等工具软件提供了自动转换的功能

