UML 通信图,历史上被称为协作图,提供了对象在系统内如何交互的空间视图。与高度关注时间的序列图不同,通信图优先考虑组件之间的结构关系。理解该符号系统中使用的特定符号,对于需要清晰记录复杂对象交互的架构师和开发人员至关重要。
本指南将详细解析标准通信图中的每一个元素。我们将探讨其视觉语法、箭头背后的含义,以及如何在不使设计杂乱的情况下表示多重性。通过掌握这些组件,您可以确保系统文档既准确又易于阅读。

🏗️ 图表的核心组件
通信图本质上是一个由节点和边组成的图。每个节点代表系统的一部分,每条边代表一种连接或交互。以下部分将详细介绍用于构建这些图的具体符号。
1. 对象实例(节点)
最基本的构建单元是对象。在通信图中,对象代表参与交互的类的实例。它们以具有以下特征的矩形表示:
- 形状:一个简单的矩形。
- 标注:矩形内的文本通常显示实例名称,后跟冒号和类名(例如:”customer: Customer).
- 格式:实例名称通常带有下划线,以区别于类名。
- 多重性:有时,如果对象代表一个集合,多重性会显示在对象标签附近。
这些节点充当所有消息的端点。没有对象,通信就缺乏上下文。绘制时,请确保名称在图表范围内是唯一的,以避免歧义。
2. 链接(关联)
链接连接对象实例。它们表示类图中定义的关联。这些线条表明一个对象持有对另一个对象的引用,从而允许发送消息。
- 视觉表现:一条连接两个对象矩形的实心直线。
- 方向性:默认情况下,链接是双向的。然而,可以通过在线条上添加箭头来表示特定的可导航性。
- 角色名称:放置在链接附近的文本描述了所连接对象所扮演的角色(例如:”manager, client).
需要注意的是,链接在场景执行过程中不会发生变化。它们代表了支持消息所展示的动态行为的静态结构。
| 符号 | 视觉表示 | 含义 |
|---|---|---|
| 对象 | 带文本的矩形 | 参与交互的类的实例 |
| 链接 | 实线 | 允许通信的结构连接 |
| 导航箭头 | 线上的空心箭头 | 指示关联遍历的方向 |
| 多重性 | 如 1..*、0..1 等数字 | 定义可以连接的实例数量 |
📩 消息符号与流程
消息是通信图的核心。它们展示了对象之间的控制流和数据流。与序列图不同,消息并非按垂直时间线排列,而是放置在连接对象的链接上。
3. 消息箭头
消息由连接两个对象的箭头表示。箭头从发送者指向接收者。箭头样式表示通信类型:
- 实心箭头:表示同步调用。发送者等待接收者完成操作后再继续。
- 虚线箭头:表示异步消息。发送者发送消息后立即继续,无需等待。
- 填充箭头:有时用于表示返回消息,但为了清晰起见,返回消息通常被省略。
箭头上的标签包含被调用的操作或方法的名称。参数可包含在括号内。例如,”calculateTotal(price, tax).
4. 序列号
由于该图未按时间垂直排序,序列号至关重要。它们告知读者消息发生的顺序。
- 格式: 一个数字后跟一个点(例如,”1, 1.1, 2).
- 根消息: 从 1.
- 递归消息: 如果一条消息触发了嵌套在第一次调用中的另一条消息,请使用小数形式的编号,例如 “1.1, 1.2.
- 并行消息: 同时发生但未嵌套的消息可以按顺序编号(例如,”2, 3).
这些编号使读者能够重建交互的时间线。它们通常放置在消息箭头附近,位于箭头线的起点或终点。
5. 返回消息
返回消息表示将结果发送回调用者。在通信图中,这些消息是可选的。如果包含,它们通常显示为指向发送者的虚线箭头。除非特定的返回值具有重要意义,否则通常不添加标签。省略它们可使图表更简洁,因为控制流已通过序列号隐含体现。
🔢 多重性与约束
通信图通常涉及对象集合。多重性符号表示有多少个类的实例参与该链接。
- 单个实例: 无符号或 1.
- 多个实例: 星号 * 或 0..* 表示零个或多个。
- 特定范围: 2..5 表示特定的计数范围。
- 放置位置: 多重性放置在链接的末端,紧邻其所描述的对象实例。
在建模一个经理管理多名员工的情景时,经理对象与员工对象之间的链接将具有 1 在经理一侧,以及 0..* 在员工一侧。这明确了系统的结构容量。
🔄 复杂结构
虽然标准通信图侧重于线性流程,但 UML 允许更复杂的建模构造。这些构造用于表示交互中的条件逻辑或循环。
6. 交互框架(循环和替代)
尽管在纯协作图中较少见,但框架可用于对消息进行分组。它们被绘制为包围相关对象和消息的大矩形。
- 循环框架: 表示内部消息重复。标签如 循环 或 while (条件) 放置在框架的顶部。
- 替代帧:表示替代路径(if/else)。它被水平线分隔为多个部分。每个部分都标有方括号中的守卫条件,例如“[有效]或“[无效].
这些帧通过隔离特定场景来帮助管理复杂性。然而,过度使用会使图表难以阅读。仅在交互逻辑存在显著分支时才使用它们。
🧭 导航与职责
理解对象如何相互发现是图表逻辑的关键。这通常通过链接箭头的方向来表示。
- 单向:如果箭头从对象 A 指向对象 B,则对象 A 知道对象 B,但对象 B 不一定知道对象 A。
- 双向:没有箭头的实线表示两个对象可以相互访问。
这种区分对于解耦至关重要。如果图表显示从“订单对象到“数据库对象的直接链接,意味着紧耦合。更好的设计可能会通过“订单服务对象进行路由。链接的视觉布局应反映这一架构决策。
🆚 比较:通信图与序列图
要完全理解这些符号,了解它们“不是”什么很有帮助。通信图常与序列图进行比较。
| 特性 | 通信图 | 序列图 |
|---|---|---|
| 重点 | 对象关系 | 时间与顺序 |
| 布局 | 结构/几何 | 垂直时间线 |
| 时间 | 隐式(通过序列号) | 显式(垂直位置) |
| 激活条 | 未使用 | 用于显示活跃执行 |
| 最适合 | 复杂对象导航 | 详细时序分析 |
通信图符号集是序列图符号集的子集。它缺少垂直生命线(lifelines)和激活条。相反,它主要依赖对象的空间排列和链接线。
🛠️ 清晰度的最佳实践
正确使用符号是一回事,有效使用符号是另一回事。以下是确保您的图表专业且易读的指南。
7. 布局策略
- 居中:将主控制器或发起者对象放置在中心。
- 分组:将相关对象保持靠近,以最小化交叉线。
- 流向:尽可能将消息安排为从左到右或从上到下逻辑流动。
8. 标注规范
- 命名一致性:在整个图表中使用相同的实例名称。
- 方法名称:方法名称使用驼峰命名法以符合代码规范。
- 数字:确保序列号唯一且逻辑清晰。
9. 避免杂乱
- 简化链接:不要显示与交互无关的链接。这可以减少视觉干扰。
- 限制消息:如果交互过于复杂,请将其拆分为多个图表。每个图表应涵盖一个特定场景。
- 隐藏返回:除非必要,否则不要绘制返回消息箭头。这可以节省空间并减少混淆。
📝 详细符号参考
以下列表可作为您将要遇到的特定视觉元素的快速参考。
- 实例名称:矩形内的文本。表示特定对象。
- 类名称:冒号后的文本。表示对象的类型。
- 链接线:连接实例的实线。
- 关联箭头:链接线上的箭头,表示可导航性。
- 消息箭头:表示调用的箭头。
- 消息标签:描述操作的文本。
- 序列号:消息前的数字前缀。
- 多重性:链接末端的数字。
- 框架:围绕一组消息的框,用于循环或条件。
- 守卫条件:框架内括号中的文本(例如:”[if open]).
🧩 实际应用
考虑一个用户登录的场景。该图将从一个 用户对象向一个 登录服务对象发送消息开始。该 登录服务随后会联系一个 数据库对象以验证凭据。最后,它将响应发送回 用户.
符号的排列方式如下:
- 对象:三个矩形排列成三角形。
- 链接:连接所有三个对象的实线。
- 消息:
- 从 用户指向 登录服务,标记为 1: 认证.
- 从 登录服务指向 数据库,标记为 1.1:验证.
- 来自“数据库”到“登录服务”(返回)。”
- 来自“登录服务”到“用户”(返回)。”
此布局清晰地显示了依赖关系。如果“登录服务”被移除,则“用户”和“数据库”将不再直接连接,突显了潜在的架构风险。”
🔍 常见故障排查
在创建这些图表时,某些错误可能导致误解。请注意以下陷阱。
- 缺少序列号:没有编号时,并行消息的顺序将不明确。务必为链中的第一条消息编号。
- 线条交叉:过多的交叉连线会使图表看起来像一团乱麻。请重新排列对象位置。
- 多重性不一致:请确保链上的多重性与类定义一致。如果类声明为“1..1”,则图表不应显示“0..*.
- 消息过载:不要在一个箭头上放置多个操作。请将它们拆分为独立的消息。
🎓 关键要点总结
UML 通信图是可视化空间上下文中对象交互的强大工具。这些符号虽然简单,却承载着重要的语义。对象定义参与者,链接定义连接,消息定义动作。
遵循标准符号规范,可确保任何审查者无需额外背景即可理解系统架构。序列号取代了时间的垂直轴,从而允许更灵活的布局。多重性符号则为结构关系增添了精确性。
请记住,图表的目标是沟通,而不仅仅是文档记录。如果符号排列不当,信息就会丢失。应优先考虑可读性,而非严格遵循网格布局。谨慎使用框架以管理复杂性,并保持消息标签简洁。
掌握了每个符号的含义后,您便能够创建清晰、有效且专业的系统设计。专注于组件之间的关系,其行为将变得清晰明了。











