一、组件图是啥?—— 系统的“物理积木图”🧱
🧠
前面的类图、顺序图讲的是系统的“逻辑结构”(比如“类怎么设计、对象怎么交互”),而组件图聚焦 系统的“物理结构”:它展示系统由哪些“可独立部署、可复用的模块(组件)”组成,以及这些组件之间如何通过“接口”连接,是系统从“逻辑设计”到“实际落地”的桥梁。
🤖 类比:
如果把系统比作“手机”,组件图就是手机的“拆解图”——展示“屏幕组件、电池组件、芯片组件”等物理模块,以及这些模块通过“充电接口、数据接口”连接的方式。
✍️ 核心作用:
- 明确系统的物理拆分:把复杂系统拆分为“订单组件、支付组件、用户组件”等可独立开发的模块;
- 规范组件间的交互:通过“接口”定义组件的调用规则,避免组件间的耦合;
- 支持团队分工协作:按组件划分开发小组(比如“订单组负责订单组件”);
- 提升可复用性:组件可单独修改 / 替换(比如把“支付宝支付组件”换成“微信支付组件”,只要接口不变)。
二、组件图的“核心零件”:组件 + 接口 + 端口 🧩
👆 1. 组件:系统的“物理模块”
组件是系统中“独立封装、可部署、可复用”的物理单元(比如“订单组件”包含“订单类、订单服务类”等代码文件),用“带小矩形的矩形”表示。组件的特点是“黑箱化”——外部只需要知道它的接口,不需要关心内部实现。
// 订单实体类
public class Order {…}
// 订单服务类(提供接口实现)
public class OrderService implements IOrderService {
public Order createOrder(User user) {…} // 实现提供接口的方法
}
🔌 2. 接口:组件的“交互规则”
接口是组件对外提供的“服务契约”,分为两种:
- 提供接口(小圆圈):组件对外提供的功能(比如“订单组件提供创建订单的接口”);
- 请求接口(小半圆):组件需要调用的外部功能(比如“订单组件需要调用支付组件的支付接口”)。
接口的作用是“解耦”——只要接口不变,组件内部的代码修改不会影响外部调用者。
public interface IOrderService {
Order createOrder(User user); // 定义组件对外提供的功能
}
🔘 3. 端口:组件的“接口插座”
端口是组件上的“接口载体”(用“小矩形”表示),一个端口可以绑定多个接口——比如“订单组件的‘业务端口’同时提供‘创建订单’和‘查询订单’的接口”。端口的作用是“分类管理接口”,让组件的接口更清晰。
三、组件图的“内部结构”:组件的“拆分解构”📦
📦
复杂组件可以包含“子组件”(比如“旅行系统组件”包含“日程组件、预订组件”),组件的内部结构展示子组件之间的接口调用关系——这相当于“把大积木拆成小积木”,让复杂组件的设计更清晰。
✍️ 实战例子:旅行系统组件的内部结构
“旅行系统组件”包含“Planner(规划子组件)”“Scheduler(日程子组件)”“UpdatPans(更新子组件)”,子组件之间通过内部接口交互(比如“Planner 调用 Scheduler 的日程接口”)。
四、组件图的建模步骤:搭好系统的“积木”📋
📌 步骤:
- 识别系统组件:根据业务功能拆分组件(比如“机票预订系统”拆分为“用户交互组件、订单组件、票务组件”);
- 定义组件接口:为每个组件设计提供接口(对外功能)和请求接口(依赖的外部功能);
- 梳理组件依赖:用“接口连接”表示组件之间的调用关系(比如“订单组件的请求接口连接支付组件的提供接口”);
- 拆分复杂组件(可选):对大型组件,展示其内部的子组件及交互关系。
五、组件图的实战价值:大型系统的“落地指南”🚀
🚀
在大型系统开发中,组件图是 团队协作和部署的“核心文档”:
- 开发阶段:按组件划分团队,每个团队只需要实现组件的接口,不用关心其他组件的内部逻辑;
- 测试阶段:针对组件的接口做“契约测试”,确保组件间的交互符合约定;
- 部署阶段:组件可独立部署(比如“订单组件部署在服务器 A,支付组件部署在服务器 B”),提升系统的可扩展性。
☁️ 复杂场景:微服务架构的组件图
微服务架构本质上是“组件的分布式部署”——每个微服务就是一个组件,组件图可以直接作为微服务的“架构图”,展示“用户服务、订单服务、支付服务”等微服务的接口和依赖关系,是微服务设计的基础。