Skip to content
难度基础(★)
建议时长45分钟

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 调用了 gpsgetCarLocation() 方法。因此在类图填方法时,getCarLocation() 更可能填在 GPSLocation 类中,而不是 Map 类中。

做下午题时,顺序图经常和类图联动考:

  1. 先看消息箭头指向谁。
  2. 再看消息名是否像方法名。
  3. 把该方法填入被调用对象对应的类。
  4. 返回消息通常不是新方法,而是返回值或结果。

通信图:按对象组织结构表达交互

通信图也叫协作图。它不强调竖直生命线,而强调对象之间如何连接,以及这些连接上发生哪些消息。

mermaid
flowchart LR
  Map["map:Map"]
  GPS["gps:GPSLocation"]
  Route["route:RouteService"]
  Map -- "1:getCarLocation()" --> GPS
  Map -- "2:calculateRoute()" --> Route

通信图中的消息通常用编号表达顺序,例如 122.1。它仍然能表达消息先后,只是视觉重点放在对象连接关系上。

顺序图与通信图对比

对比项顺序图/序列图通信图/协作图
同属交互图交互图
核心问题消息按什么时间顺序发生哪些对象参与协作,它们如何连接
主要线索生命线、激活条、从上到下的消息对象连接、消息编号
是否能表达顺序能,天然按纵向时间表达能,靠消息编号表达
考试识图看到生命线和时间轴没有生命线但有对象消息流

如果题目给出对象之间的消息通信,但没有生命线,通常判断为通信图;如果有生命线并且消息从上到下排列,通常判断为顺序图。

与其他图的区分

题干描述对应图
对象之间消息流及其顺序通信图或顺序图,具体看图形线索
对象之间消息发送的时间先后顺序图
完成任务所需进行的活动流活动图
对象状态转换及事件顺序状态图
类、接口、协作以及关系类图

例题

单选
强调对象消息发送的时间先后顺序,适合使用:
单选
在顺序图中,消息 `readCard()` 从 `station` 指向 `cardReader`,通常说明 `readCard()` 方法属于:

自查要点

  1. 顺序图为什么也叫序列图?
  2. 顺序图中 对象名:类名 表示什么?
  3. 消息箭头如何帮助判断方法属于哪个类?
  4. 通信图没有生命线时,如何表示消息顺序?