10.4.6 顺序图与通信图
顺序图和通信图都属于交互图。交互图描述一组对象或参与者之间如何通过消息协作,常用来展开某个用例的实现过程。
两者表达的信息接近,甚至可以相互转换,但关注点不同:顺序图看时间,通信图看组织结构。
顺序图:按时间展开的对象协作
顺序图也叫序列图。它用生命线表示对象存在的时间,用消息箭头表示对象之间的调用。
mermaid
sequenceDiagram
participant Map as map:Map
participant GPS as gps:GPSLocation
participant Route as route:RouteService
Map->>GPS: getCarLocation()
GPS-->>Map: currentPosition
Map->>Route: calculateRoute(currentPosition, target)
Route-->>Map: routeInfo顺序图常见元素:
| 元素 | 含义 | 识图线索 |
|---|---|---|
| 对象/参与者 | 交互中的角色 | 常写成 对象名:类名 或 :类名 |
| 生命线 | 对象在交互中的存在时间 | 对象下方的竖直虚线 |
| 激活条 | 对象正在执行操作的时间段 | 生命线上的窄长矩形 |
| 消息 | 对象之间的调用或通信 | 带方法名的箭头 |
| 返回消息 | 调用结果返回 | 通常用虚线箭头 |
| 销毁 | 对象生命周期结束 | 常用 X 标记 |
时间在顺序图中通常从上往下推进。越上面的消息越早发生,越下面的消息越晚发生。
消息箭头还能反推方法归属
课程里特别强调一个很实用的点:消息名通常对应方法名,而方法属于箭头指向的那个对象所属的类。
例如:
text
map:Map ---- getCarLocation() ----> gps:GPSLocation这表示 map 调用了 gps 的 getCarLocation() 方法。因此在类图填方法时,getCarLocation() 更可能填在 GPSLocation 类中,而不是 Map 类中。
做下午题时,顺序图经常和类图联动考:
- 先看消息箭头指向谁。
- 再看消息名是否像方法名。
- 把该方法填入被调用对象对应的类。
- 返回消息通常不是新方法,而是返回值或结果。
通信图:按对象组织结构表达交互
通信图也叫协作图。它不强调竖直生命线,而强调对象之间如何连接,以及这些连接上发生哪些消息。
mermaid
flowchart LR
Map["map:Map"]
GPS["gps:GPSLocation"]
Route["route:RouteService"]
Map -- "1:getCarLocation()" --> GPS
Map -- "2:calculateRoute()" --> Route通信图中的消息通常用编号表达顺序,例如 1、2、2.1。它仍然能表达消息先后,只是视觉重点放在对象连接关系上。
顺序图与通信图对比
| 对比项 | 顺序图/序列图 | 通信图/协作图 |
|---|---|---|
| 同属 | 交互图 | 交互图 |
| 核心问题 | 消息按什么时间顺序发生 | 哪些对象参与协作,它们如何连接 |
| 主要线索 | 生命线、激活条、从上到下的消息 | 对象连接、消息编号 |
| 是否能表达顺序 | 能,天然按纵向时间表达 | 能,靠消息编号表达 |
| 考试识图 | 看到生命线和时间轴 | 没有生命线但有对象消息流 |
如果题目给出对象之间的消息通信,但没有生命线,通常判断为通信图;如果有生命线并且消息从上到下排列,通常判断为顺序图。
与其他图的区分
| 题干描述 | 对应图 |
|---|---|
| 对象之间消息流及其顺序 | 通信图或顺序图,具体看图形线索 |
| 对象之间消息发送的时间先后 | 顺序图 |
| 完成任务所需进行的活动流 | 活动图 |
| 对象状态转换及事件顺序 | 状态图 |
| 类、接口、协作以及关系 | 类图 |
例题
强调对象消息发送的时间先后顺序,适合使用:
在顺序图中,消息 `readCard()` 从 `station` 指向 `cardReader`,通常说明 `readCard()` 方法属于:
自查要点
- 顺序图为什么也叫序列图?
- 顺序图中
对象名:类名表示什么? - 消息箭头如何帮助判断方法属于哪个类?
- 通信图没有生命线时,如何表示消息顺序?