通信图(在UML 1.x中称为协作图)是一种用自由形式排列的有序消息显示对象和/或部分(表示为生命线)之间交互的UML交互图。
通信图对应于(即,可以转换成/转换成或替换成)简单的序列图,而没有结构化机制,例如交互使用和组合片段。还假设不会发生消息超越(即,接收的顺序不同于给定消息集的发送顺序)或者消息超越是不相关的。
在一个UML通信图中绘制了以下节点和边线:框架、生命线、消息。下图显示了通信图的这些主要元素。
UML通信图的主要元素
片段
通信图可以显示在矩形框架内,名称在左上角的分隔的空间中
通信图标题类型没有特定的长格式名称。可以使用长形式名称交互(通常用于交互图)。
通信图buyitem的交互框架
通信图也没有特定的简称。可以使用简短的名称sd(通常用于交互图)。这个sd有点混乱,因为它看起来像序列图的缩写。
通信图buyitem的sd框架
生命线
生命线是命名元素的专门化,它代表交互中的个体参与者。虽然零件和结构特征的多重性可能大于1,但生命线仅代表一个交互实体。
如果引用的可连接元素是多值的(即多重性> 1),那么生命线可以有一个表达式(选择器),该表达式指定该生命线表示哪个特定部分。如果省略选择器,这意味着选择多值可连接元素的任意代表。
生命线显示为矩形(对应于序列图中的“head”)。序列图中的生命线确实有代表生命线的“tail”,而通信图中的生命线没有线,只有“head”。
识别生命线的信息以以下格式显示在矩形内:
lifeline-ident ::= ([ connectable-element-name [ '[' selector ']' ] ] [: class-name ] [decomposition] ) | 'self'
selector ::= expression
decomposition ::= ‘ref' interaction-ident [ 'strict' ]
其中类名是由所表示的可连接元素引用的类型。请注意,尽管语法允许,lifeline-ident不能为空。
生命线头部的形状基于生命线所代表的部分的分类器。通常头部是一个白色矩形,在冒号后包含类名。
类User的匿名生命线
生命线 “数据”类库存
用选择器[k]选择等级为X的生命线“X”。
如果名称是关键字self,则生命线代表包含拥有生命线的交互的分类器的对象。 即使包括self, 封闭端口 也可以单独显示。
消息
通信图中的消息显示为一行,该行上方带有序列表达式和箭头。箭头指示通信方向。
如果s1等于s2,则类A的实例向类B的实例发送remove()消息
序列表达式
序列表达式是序列项的点分隔列表,后面跟着冒号(“:”)和消息名:
sequence-expression ::= sequence-term '.' . . . ':' message-name
例如,3b.2.2:m5
包含序列表达式3b.2.2和消息名m5。
每个序列项代表整个交互中的一个程序嵌套级别。每个序列项都有以下语法:
sequence-term ::= [ integer [ name ] ] [ recurrence ]
整数表示消息在下一个更高级别的过程调用(激活)中的顺序。在一个整数项上不同的消息在嵌套层次上是连续的。
例如,
- 序列2的消息跟随序列1的消息,
- 2.1跟随2
- 5.3遵循激活5中的5.2
- 1.2.4遵循激活1.2中的消息1.2.3。
实例A向实例B发送draw()消息,然后实例B向实例C发送paint()
重复定义了根据指定条件执行的零个或多个消息的有条件或迭代执行。
recurrence ::= branch | loop
branch ::= '[' guard ']'
loop ::= '*' [ '||' ] [ '['iteration-clause ']' ]
保护指定消息在给定嵌套深度发送(执行)的条件。UML没有指定保护语法,所以它可以用伪代码、某种编程语言或其他语言来表示。
例如
2.3b [x>y]:绘制()-如果x大于y,将执行消息绘制()。
1.1.1 [s1.equals(s2)]: remove() -如果s1等于s2,将执行消息remove()。
类的实例将发送消息
如果x > y,将()绘制到C的实例
迭代指定给定嵌套深度的消息序列。UML没有指定迭代子句语法,所以它可以用伪代码、某种编程语言或其他语言来表示。迭代子句可以省略,在这种情况下,迭代条件是未指定的。
*迭代符号指定迭代中的消息将顺序执行。*||(星号后跟双垂直线)迭代符号指定消息的并发(并行)执行。
例如,
- 4.2c *[i=1..12]: search(t[i]) --search() 将被执行12次,一次接一次
- 4.2c *||[i=1..12]: search(t[i]) - 12 search()消息将同时发送,
- 2.2 *: notify() - message notify() 将重复一些未指定的次数。
甲类实例将一个接一个地向乙类实例发送search()消息
甲类实例将向乙类实例发送n条并发搜索()消息
嵌套控件结构中的内部级别不会重复递归。每一层结构都在封闭上下文中指定了自己的迭代 |