通信图 – 对象交互的“关系拓扑图” 🕸️

260次阅读

一、通信图是啥?—— 交互的“关系地图”🗺️

关键字:通信图、对象协作、链、消息顺序、空间组织结构

🧠

通信图和顺序图是“兄弟图”——都描述对象的交互过程,但 侧重点不同 :顺序图是“按时间排流程”,通信图是“按关系排结构”:它展示参与交互的对象、对象之间的连接(链),以及消息在链上的传递顺序,核心是 对象的空间组织关系

🤖 类比:

如果顺序图是“快递配送的时间线”(用户下单→商家发货→骑手配送→用户收货),那通信图就是“快递配送的关系网”——展示“用户、商家、骑手、快递站”这几个节点的连接方式,以及消息(订单、包裹、签收通知)在节点间的传递路径。

✍️ 核心作用:

  • 展示对象的交互结构:明确“谁和谁有直接关联”;
  • 验证类图的关联关系:检查对象间的链是否符合类图的关联设计;
  • 表达操作的实现逻辑:把抽象的操作转化为“对象 + 链 + 消息”的具体协作。

二、通信图的“零件”:对象 + 链 + 消息 🧩

关键字:对象、多重对象、链、动态关联、消息、消息序号

👆 1. 对象:交互的“节点”

通信图中的对象和顺序图一致,是类的实例(比如“用户”“系统查询界面”),但支持 多重对象——用“*”标记(比如“多个航班对象”表示为:Flight *),代表一组同类对象参与交互。

🔗 2. 链:对象的“连接路径”

链是对象间的“直接连接”,是类图中“关联关系”的 动态实例(类图的关联是“静态规则”,链是交互时临时建立的“动态连接”)。链用“实线”表示,连接有消息传递的对象。

⚠️ 注意:

链是“临时的”——交互结束后,对象间的链可能消失(比如“用户查询航班”结束后,用户和航班对象的链就断开了)。

💬 3. 消息:链上的“传递内容”

消息是对象间通过链传递的指令,用“链上的短箭头”表示,箭头指向接收者。和顺序图不同,通信图的消息需要用 序号 表示顺序(比如“1: 查询航班()”“1.1: 发送查询请求()”),序号的层级对应消息的嵌套关系。

// 对应通信图中“用户→系统查询界面→TicketManagement”的消息
User user = new User();
SystemQueryUI ui = new SystemQueryUI();
TicketManagement tm = new TicketManagement();// 1: 用户向界面发“查询航班”消息
ui.queryFlight(user.getQueryCondition());
// 1.1: 界面向 TicketManagement 发“发送查询请求”消息
tm.receiveQueryRequest(ui.getCondition());

三、通信图 vs 顺序图:各有擅长的“舞台”🎭

关键字:通信图与顺序图的异同、结构 vs 时间

🤝 相同点:

  • 元素相同:都包含对象、消息;
  • 语义等价:都描述同一个用例的交互过程;
  • 职责相同:对象都是消息的发送者 / 接收者。

🔄 不同点:

  • 侧重点:通信图侧重“对象的空间结构(谁和谁相连)”,顺序图侧重“消息的时间顺序”;
  • 时间表达:顺序图用“生命线长度”表示时间,通信图用“消息序号”表示顺序;
  • 对象状态:顺序图能显示对象的“激活 / 销毁”,通信图无法展示。

🌰 场景选择:

如果要向产品经理展示“哪些对象参与了查询航班”,用通信图(看结构);如果要向程序员展示“查询航班的代码调用顺序”,用顺序图(看流程)。

四、通信图的建模步骤:画好“关系地图”📋

关键字:建模技术、识别语境、对象排列、链连接、消息添加

📌 步骤:

  • 识别交互语境:确定要展示的用例(比如“查询航班”);
  • 排列对象:把重要对象放中间,关系近的对象放旁边;
  • 连接链:用实线连接有消息传递的对象;
  • 添加消息:按交互顺序给消息编号,写在链上(比如“1: 查询航班()”);
  • 补充约束:添加循环、条件等逻辑(比如“*[i=1..n]: 循环查询余票”)。

✍️ 实战例子:机票查询的通信图

对象包括“用户、系统查询界面、TicketManagement、Flight*、Ticket*”,链连接这些对象后,添加消息“1: 查询航班()→1.1: 发送查询请求()→1.2: 筛选航班()”等,用序号体现流程。

五、通信图的实战价值:复杂系统的“结构校验器”🔍

🚀

在大型系统中,通信图常用于 验证类图的关联设计——比如类图中“User”和“Order”是关联关系,通信图可以展示“User→Order”的链是否在交互中实际使用,避免类图设计的“冗余关联”。

☁️ 复杂场景:分布式系统的服务依赖

对于微服务架构,通信图可以展示“用户端→网关→订单服务→库存服务”的服务连接关系,帮助识别“服务间的不必要依赖”(比如订单服务直接调用支付服务,而不是通过网关)。

正文完
 0