一、相关概念
1.通信图强调发送和接收消息的对象之间的组织结构,用于显示对象之间如何进行交互以执行特定用例或用例中特定部分的行为
适合在分析活动中使用,用于描述少量对象的简单交互
作用:
通过描绘对象之间消息的传递情况来反映具体的使用语境的逻辑表达
显示了在交互过程中各个对象之间的组织关系及对象彼此之间的链接(强调关系不侧重交互的顺序,使用序号来确定消息的顺序)
表现一个类操作的实现,说明类操作中用到的参数、局部变量及返回值等
2.基本元素
活动者,对象,链接和消息
3.活动者
发送初始消息来启动一个操作
4.对象
对象是类的实例(就是一个暂时的类元),负责发送和接收消息(解释一下暂时的类元,就是说有一个猫类,其中有个小花猫对象叫了一声,那么这只小花猫只有在叫了一声这个动作情景下才有用,过了这个情景就没它啥事了)
在通信图中没有生命线,无法表示对象的创建和撤销,所以对象在通信图中的位置没有限制
在使用对象时:
可以先不指定对象的类,而后再指定
当区分同一个类的对象时要给对象命名
如果对象的类主动参与了协作,可以将类本身在通信图中表现出来
5.链接
链接表示两个对象之间或对象和参与者之间共享一个消息
链接是关联的实例,链表示一个或多个相连的线或弧
6.消息
不带有消息的通信图表示交互作用发生的上下文(就是说这个图就表现出了动作的对象,就是接力赛中你接前面的人a的棒传给你的下一个人b,在这里我们只能看出你们是这样一个顺序即a->你->b,具体你们干了啥谁也不知道)
关联线上带有消息就可以表示交互(在这里我们就知道你们三个在干啥了,在传接力棒)
消息是一个带标签的实线箭头,附着在链上,箭头指向接收者
语法:序号:名称(可以是一个方法,包含名字,参数表,返回值)
消息的方式:
1)序列化
最简单的一种方式,是默认情况下使用的,只需在消息前添加序号即可
2)控制点条件
根据消息表达式计算结果决定发不发消息,表达式放在序列号和消息名称之间
3)创建实例
可以在运行过程中创建对象,新创建的对象构造类型使用new,消息构造类型使用create
4)发送给多对象的消息
向同一个类的多个对象发消息,对象是一个重叠形态,消息序号后面加*
在*后面可以添加条件,while之类的(如果需要按顺序的话可以考虑这么限制)
5)返回结果
消息需要返回结果用这个
语法:序号:返回值名字:=操作名(参数表)
6)构造型
创建新元素,双尖括号括起来一个关键字
接口就是一个使用构造型的例子《interface》
7.通信图和顺序图的比较
二者都表示出了对象间的交互作用,在语义上是等价的可以相互转换
区别:
1)侧重点不同:顺序图是强调时间顺序的交互图,没有明确表示对象间的关系(对象沿x轴排列,消息沿y轴按时间顺序排列),通信图强调发送和接收消息的对象之间的组织结构,时间顺序必须从顺序号获得(图形上是定点与弧的结合)
2)顺序图可以反映对象的创建、激活、销毁等生命周期,通信图没有
3)通信图能反映动作路径,消息必须有顺序号,但是顺序图没有
在需要时间顺序,用于表示方案的时候使用顺序图
在注重对象间关系,用于对过程的详细设计的时候使用通信图
二、建立通信图
一个通信图只能显示一个控制流
步骤:
1)确定交互的上下文
2)确定参与过程的活动者和对象
3)给对象设置初始特性(如果需要的话)
4)确定活动者、对象之间的链接
5)从初始消息开始将消息附着在链接上
6)细化完善
三.几个例子
1.车主用车钥匙关车门的通信图
1)确定交互的上下文:就是车主用车钥匙对车进行关锁的情景
2)确定参与过程的活动者和对象:车主,车钥匙,车
3)给对象设置初始特性(如果需要的话)
4)确定活动者、对象之间的链接:车主,车钥匙,车三者之间相互关联
5)从初始消息开始将消息附着在链接上:首先车主先给钥匙发消息让它关门,钥匙收到了再给车发消息让它关门,最后车叫唤两声,忽闪两下告诉车主它锁了
6)细化完善
这个图要注意一下1、2、3个消息是call类型,就是调用,可以理解为让...去干什么,而4、5是send类型就是告诉你让你知道发生了啥
其中1、2消息中带有参数a,就是说在执行这个操作时要用到参数a(可能表示一个按下锁键的概念)这个参数,你自己打也行,也可以在属性区修改
3是一个自连接,表示汽车调用自己的关锁方法,让车关了
在3、4、5中前面的中括号表示条件,只有当中括号中为真时才传递消息
前面的参数如果不显示可以如下操作,这个位置只要不选择none就会显示出参数
再者,如果写名字的时候要打括号,冒号等都要用英文,不然不识别还会自动默认给你加上
2.ATM取款
这个有点复杂,放到下一篇博客(uml基础-通信图(ATM取款))里细说