以下内容部分出至博客园coolstream,主要是自己懒得写了,部分做了修改。
简介
通信图表示对象之间的消息往来,是表述时序图中信息交互的另一种UML图,介绍完时序图就要对照学习一下通信图,二者是一体两面的。
通信图和时序图可以相互转换,二者的侧重点不同,通信图侧重哪些对象发送或接收了哪些消息,时序图侧重对象之间消息交互的时间顺序。
通信图建模步骤
- 确定系统需要和哪些外部参与者交互通信
- 确定系统内哪些主要对象之间有发送或接收消息的需求
- 确定外部参与者与系统对象之间、系统内部对象与对象之间的消息内容和消息类型
- 用相应的链将参与者和对象、对象和对象或对象自身连起来
- 确定参与者与对象之间、对象与对象之间的约束条件
通信图主要元素
-
对象:通信图中交互的主体
-
三种UML表示法:
一般表示法:包括对象名、冒号、类名和下划线
image
只包括类名、冒号和下划线:标识该类的所有实例,这种方式称为匿名对象
image
只包括对象名
image -
添加对象:
添加参与者:Actor拖到通信图中
Actor.PNG
添加普通对象:直接点击工具栏中的图标,在Name处输入“对象名”
object.PNG
添加类信息:右击对象或者actor选择高级的intanceClassifier
class.png
-
-
链接:让消息在不同的对象间传递
UML表示法-
不同对象之间通信路径
image -
调用自身属性,会根据情况显示不同效果
linestyle.png -
添加链接:直接点击工具栏中的图标,选中要关联的对象或者选中自己两次
associate.PNG
-
-
消息:不同对象之间通信的内容。分为链接消息(Link Message)和数据标记(Data Token)两种
-
UML消息表示法
同向.PNG
不同对象之间或对象自身增加链接消息;分同步和异步
不同对象之间或对象自身反向增加链接消息
反向.PNG
不同对象之间的数据标记(EA中没有
)
image
不同对象之间的反向数据标记(EA中没有
)
image -
消息标签格式:[前置消息号列表] [条件] 消息序列表达式 [返回值 :=] 消息名([参数列表])
- 前置消息号列表
消息号:有两种,一种是无层次编号;另一种是嵌套的编号,表示消息的包含层次
语法规则:消息号,消息号,……,消息号 /(EA中只有一个)
作用:用来同步线程,表示在发送当前消息之前[前置消息号列表]中各消息号指代的消息被处理 - 条件
语法规则:[条件语句]
作用:当条件满足时才进行通信 - 消息序列表达式
语法规则:[消息号|name][recurrence]:
消息号:参见[前置消息号列表]处解释
name:同时发送的并发消息
recurrence:一个条件或循环的执行,有两种选择
-*[循环语句]:循环用*标识,如 *[x = 1...100]
-[条件语句]:这里的条件表示分支,如[x > 0] - 返回值:操作调用的结果
- 消息名:消息的名字
- 参数列表:所需参数列表
- 示例:
简单消息: 1: run()
带返回值的消息: 1: p:=query()
嵌套消息: 2.2.2: action()
循环消息: 1.4 *[x = 1...100]: execute()
条件消息: 3[x > 0]: drive(source, dest)
带前置消息号列表的消息:2.1, 2.2/2.3: test() #在发送消息2.3之前先发送消息2.1和2.2
在EA中默认消息2.1、2.2、2.3是有顺序的,如果要表示2.2和2.3之间没有关联(2.1、2.1.1、2.1.1.1 和 2.2、2.2.1、2.2.1.1使用Sequence Communications Messages的向左向右按钮),但是两者和2.0还是有顺序关系的
- 前置消息号列表
-
添加链接消息(Add Link Message):
-
进入添加链接消息操作框:点击两个对象之间的链接,右击后选择要新建的消息
addmessage.png -
设置链接消息的类型:双击链接消息,右侧Properties设置
Properties.PNG
-
-
通信图与时序图的关系
-
联系
都是交互图,都描述了参与者与对象之间、对象与对象之间的消息通信过程
都需要消息编号来标识顺序
二者可以相互转化 -
区别
侧重点:通信图侧重哪些对象交互了哪些消息;时序图侧重不同对象间交互消息的时间顺序
创建和销毁对象:通信图中无法创建和销毁对象;时序图中可以明确标识对象的创建和销毁
激活与去激活:通信图无法标识对象的激活与去激活;时序图中可以明确标识对象的激活与去激活 -
转化
communication.PNG
时序图转化为通信图:在EA中打开时序图,然后选择菜单Design > Tools > Transform > Transform Selection【Ctrl+Shift+H (transform current Package)、Ctrl+H (transform selected elements)】,选择apply Transformations,然后在Transformations里面选择类型Sequence和目标包。
原时序图
转化后的通信图(move后)
transSequence .PNG
通信图转化为时序图:在EA中打开时序图,然后选择菜单Design > Tools > Transform > Transform Selection【Ctrl+Shift+H (transform current Package)、Ctrl+H (transform selected elements)】,选择apply Transformations,然后在Transformations里面选择类型Communication和目标包。
原通信图
alt.PNG
转化后的时序图(move后)
tramCommunication.PNG -
通信图示例
image
以图书馆新书采购流程为例
-
通信图注意事项
侧重消息的调用顺序,就使用时序图;侧重参与者之间的链接,就使用通信图。
通信图中表示对象的方法与对象图中表示对象的方法一致。
通信图交互过程中可能会创建新对象、销毁已有对象、创建并销毁新对象。
通信图中的消息较为复杂,需要区分嵌套、条件及循环等消息的应用场景,尤其是多级消息号的使用。
网友评论