UML交互图(顺序图和通信图)
1.交互图简介
UML使用交互图来描述对象间通过消息的交互,交互图可以用于动态对象建模。
当我们要考虑真正的面向对象设计细节时,就必须要“落实”发送哪些消息、发送给谁、以何种顺序发送等具体问题。应该花费时间使用交互图进行动态对象建模,而不仅是使用类图进行静态对象建模。
交互图在精化阶段中使用,用来描述一个用例的行为,显示该用例中所涉及的对象以及这些对象之间的消息传递情况
2.前置——CRC cards(Class-Responsibility-Collaborator)
CRC卡用于职责分配,是交互图和类图的极简版,在初始阶段使用
- 类 类名写在整个CRC卡的最上方。
- 职责 包括这个类对自身信息的了解,以及这些信息将如何运用。这个部分在CRC卡的左边。
- 协作 指代另一个类,这里写的信息是协作的类名。我们通过这个类获取我们想要的信息或者相关操作。这个部分在CRC卡的右边。
3.对比和优缺点
在这两种类型的交互图中,顺序图具有更丰富的符号标记,更容易查阅,但是通信图也有其独特的功能,尤其适用于在墙上画草图。
- 在表示法选项方面,UML规范更多是以顺序图为核心,对其表示法和语义投入了更多的精力。因此,顺序图对工具的支持更好,并且有更多有效的表示法选项。
- 在阅读顺序方面,采用顺序图可以更方便地表示调用流的顺序,仅需要由上至下阅读即可,而对于通信图,我们则必须查阅顺序编号。因此,顺序图在文档化方面更胜一筹。
- 在空间效用方面,通信图更具有优越性,因为可以在任何位置(水平或垂直)方便地放置或擦除框图。相比之下,在顺序图中添加的新对象时必须总是位于纸(或墙)的右边,因而右边的空间会很快被占用;垂直方向的空余空间不能得到有效利用。因此,用通信图绘制的墙上草图更易于修改,在墙上绘制。
4.交互图详解
4.1 顺序图通信图共同点
生命线框图
UML中定义了参与者框图的以下几种表达:
消息表达式
交互图展示了对象之间的消息,UML对于这些消息表达式具有标准语法:
return = message(parameter : parametreType) : returnType
没有返回值时,返回值可省略,没有参数时,圆括号可省略,类型信息不重要时也可省略,甚至可以只保留方法名
4.2 顺序图
基本构成
- 虚线为生命线(类的存活时间)
- 箭头实线代表对象间的消息(典型同步消息)
- 执行规格条(Execution specification bar)表示控制期(focus of control)
- 最开始的消息在UML中称为初始消息,没有特定发送者。
- 带返回值的消息既可以使用消息表达式来表示,也可以通过反方向的虚线箭头表示应答线,应答线上应标记返回值。
- 还有发送给自身的消息
创建与销毁对象
- 在某个对象当中创建新实例,使用create
- 并且新创建的对象,被置于其创建的“高度”上
- 若需要显式地表示对象的销毁,用大X和终止于大X的生命线表示。
框图
有条件框图,里面的方法都遵循该条件执行(if,for等等),more items代表保护消息,或者称作条件子句
下图左侧是以图框操作符opt表示的"“有条件消息”,右侧是以图框操作符alt表示的"互斥的有条件消息"。互斥的有条件消息的图框用虚线分为上下两部分,条件子句为真时,走上方的消息路径,否则走下方的路径。
下图是循环消息的两种表示法。
标记ref的框图,是引用其他顺序图来简化,命名其他顺序图只要打上sd标签
至于常见图框操作符的含义,如下表所示:
多态
多态类,以这种方式对抽象类以及其每个实现画图
同步与异步
异步调用使用的箭头为刺形箭头,因为不用等待响应,因此不会阻塞,而常规同步(阻塞)调用用实心箭头表示
主动对象(active object)在生命线框图两侧加双竖线。
即在其进行的执行线程中运行或控制自己的执行线程的实例
顺序图代码实例
代码与图之间的关系如图所示,被指向的类B拥有箭头所示方法,发出箭头的类A调用方法
消息的传播
1.makePayment消息被发送到Register一个实例
2.Register实例将makePayment消息发送到Sale实例
3.Sale实例创建Payment实例
4.3 通信图
链、消息
链(link)是连接两个对象的路径,它指明了对象间某种可能的导航和可见性,更正式地说,链是关联的实例
如图所示,从Register到Sale之间有一条链,消息会沿此链流转,例如makePayment消息。
-
对象间的每个消息都可以使用消息表达式,和指明消息方向的小箭头表示,许多消息会沿着此链传输,可以增加顺序编号,以表示当前控制线程中消息的次序需要注意所有的消息在同一条链上流转。
-
对象可以向自身发送消息,在这种情况下,使用到自身的链来表示,消息将沿着此链传输。
创建实例
消息嵌套(编号)
- 可以不给起始消息(外部消息)编号,这样可以简化编号易于理解
有条件消息
带有互斥路径的有条件编号
三者组合使用
迭代和循环
迭代子句和循环条件子句不重要时可以用星号简化
代表遍历lineItems中每个元素
多态
同步和异步消息
一样是刺形箭头代表异步调用