本文最后更新于67 天前,其中的信息可能已经过时,如有错误请发送邮件到3082654005@qq.com
要清晰区分 UML 中的聚合关系、组合关系、依赖关系、关联关系,可通过 “关系性质、耦合程度、生命周期关联、实例关系、UML 符号、典型场景” 等核心维度对比,以下是结构化表格:
| 对比维度 | 依赖关系 (Dependency) | 关联关系 (Association) | 聚合关系 (Aggregation) | 组合关系 (Composition) |
|---|---|---|---|---|
| 核心定义 | 一方(依赖方)临时使用另一方(被依赖方)的功能,无结构关联 | 双方存在稳定的结构关联(如持有引用),是最基础的对象间关系 | 「整体 – 部分」关系,部分可脱离整体独立存在 | 「整体 – 部分」关系,部分无法脱离整体独立存在 |
| 耦合程度 | 最松散(临时调用,无长期引用) | 中等(稳定引用,无生命周期绑定) | 较紧(整体包含部分,部分可复用) | 最紧(整体控制部分的生死) |
| 生命周期关联 | 无关联(依赖方销毁不影响被依赖方,反之亦然) | 无关联(双方生命周期独立,如学生毕业不影响课程) | 无强关联(整体销毁,部分可继续存在,如汽车报废轮胎可再用) | 强关联(整体创建→部分创建,整体销毁→部分销毁,如人死亡后心脏无意义) |
| 实例关系 | 依赖方仅在特定行为中使用被依赖方(如 “订单服务” 调用 “日志工具类” 打日志) | 一方可持有另一方的引用(如 “学生” 持有 “课程” 的列表,“课程” 也可持有 “学生” 的列表) | 整体包含部分,部分可属于多个整体(如 “轮胎” 可属于 “汽车 A”,也可拆下来装到 “汽车 B”) | 整体包含部分,部分仅属于一个整体(如 “部门” 只能属于一个 “公司”,不能同时属于两个公司) |
| UML 符号 | 虚线 + 箭头(箭头指向被依赖方,表示 “依赖方→依赖→被依赖方”) | 实线(可加箭头表示单向关联,无箭头默认双向) | 空心菱形(在整体端) + 实线(连接整体与部分) | 实心菱形(在整体端) + 实线(连接整体与部分) |
| 典型场景示例 | 1. 工具类调用(如 OrderService.log() 调用 LogUtil.print())2. 方法参数 / 返回值(如 void addUser(User user) 中 User 是依赖) | 1. 学生与课程(学生选课程,课程包含学生) 2. 客户与订单(客户创建订单,订单归属客户) | 1. 汽车与轮胎(轮胎可拆换,用于其他汽车) 2. 图书馆与图书(图书可外借,脱离图书馆存在) | 1. 公司与部门(部门随公司创建而创建,随公司解散而撤销) 2. 人与心脏(心脏无法脱离人独立存在) |
核心区别总结
- 是否为 “整体 – 部分” 关系:
- 聚合、组合是「整体 – 部分」关系;依赖、关联不是(依赖是 “使用”,关联是 “结构关联”)。
- 部分能否脱离整体:
- 聚合:能(轮胎≠汽车);组合:不能(心脏 = 人的一部分)。
- 生命周期是否绑定:
- 组合:强绑定(整体控部分生死);聚合 / 关联 / 依赖:无绑定。
- 耦合松紧:
组合 > 聚合 > 关联 > 依赖(依赖最灵活,组合最稳定但耦合最高)。