类关系是什么
UML 类图中类与类之间有六种常见关系:泛化、实现、关联、聚合、组合、依赖。判断聚合与组合的关键在于部分能否脱离整体独立存在:能独立存在用聚合(空心菱形),生命周期绑定用组合(实心菱形)。菱形永远画在整体一侧,方向决定谁承担生命周期责任。
六种关系
| 关系 | 记法 | 语义 | 示例 |
|---|---|---|---|
| 泛化 | 实线加空心三角 | is-a 继承 | VIP 用户 泛化自 用户 |
| 实现 | 虚线加空心三角 | 实现接口或契约 | 订单服务 实现 订单接口 |
| 关联 | 实线,可带方向与多重度 | 长期结构关系 | 订单 关联 客户 |
| 聚合 | 实线加空心菱形 | 整体-部分,部分可独立存在 | 车队 聚合 车辆 |
| 组合 | 实线加实心菱形 | 部分随整体生命周期消亡 | 订单 组合 订单行 |
| 依赖 | 虚线加箭头 | 临时使用,参数或局部变量 | 结算服务 依赖 汇率服务 |
聚合与组合的区别
判断聚合与组合的关键在于部分能否脱离整体独立存在:车队解散后车辆仍然存在,属于聚合;订单删除后订单行不再有意义,属于组合。落到实现层,组合通常对应外键级联删除或内嵌值对象,聚合则需要独立主键与独立的生命周期管理。菱形永远画在整体一侧,方向决定谁承担创建与销毁责任。
判定顺序
- 先问是否 is-a:是则用泛化,实现契约则用实现
- 再问是否整体-部分:是则看部分能否独立存在,能则聚合,不能则组合
- 剩余关系看是否长期持有:长期持有用关联,只在方法里临时用则依赖
- 多重度必填:1、0..1、星号,缺多重度的关联容易让实现者误解
建模检查点
- 每个关联都要能回答为什么两个对象需要长期相互引用
- 组合关系要在数据库或对象映射里有对应的生命周期约束
- 依赖关系不要画成关联,否则模型里会堆满噪音连线
- 泛化层级建议不超过三层,超过时考虑用组合替代
- 多重度必须与业务规则一致,例如一个订单允许几行明细
典型使用场景
- 领域建模:把业务对象的结构关系固化到模型里
- 代码评审:对照类图检查生命周期与级联删除是否一致
- 遗留系统梳理:反向画出类关系,找出循环依赖
- 团队沟通:统一表达方式,避免口头描述结构
聚合与组合的菱形永远画在整体一侧;方向画错会让实现者误解谁负责对象的创建与销毁。
依赖是六种关系里最弱的一种,只在方法参数、局部变量或静态调用中出现。如果两个类互相依赖,通常说明职责边界需要重新划分,而不是补一条双向箭头就能解决。