首页/开发/系统分析与架构设计速查/类关系:泛化、实现、聚合与组合
需求分析与建模61 条

类关系:泛化、实现、聚合与组合

类之间常见六种关系:泛化、实现、关联、聚合、组合、依赖;聚合与组合的区别在于部分能否脱离整体独立存在,菱形画在整体一侧。

类关系是什么

UML 类图中类与类之间有六种常见关系:泛化、实现、关联、聚合、组合、依赖。判断聚合与组合的关键在于部分能否脱离整体独立存在:能独立存在用聚合(空心菱形),生命周期绑定用组合(实心菱形)。菱形永远画在整体一侧,方向决定谁承担生命周期责任。

六种关系

关系记法语义示例
泛化实线加空心三角is-a 继承VIP 用户 泛化自 用户
实现虚线加空心三角实现接口或契约订单服务 实现 订单接口
关联实线,可带方向与多重度长期结构关系订单 关联 客户
聚合实线加空心菱形整体-部分,部分可独立存在车队 聚合 车辆
组合实线加实心菱形部分随整体生命周期消亡订单 组合 订单行
依赖虚线加箭头临时使用,参数或局部变量结算服务 依赖 汇率服务

聚合与组合的区别

判断聚合与组合的关键在于部分能否脱离整体独立存在:车队解散后车辆仍然存在,属于聚合;订单删除后订单行不再有意义,属于组合。落到实现层,组合通常对应外键级联删除或内嵌值对象,聚合则需要独立主键与独立的生命周期管理。菱形永远画在整体一侧,方向决定谁承担创建与销毁责任。

判定顺序

  • 先问是否 is-a:是则用泛化,实现契约则用实现
  • 再问是否整体-部分:是则看部分能否独立存在,能则聚合,不能则组合
  • 剩余关系看是否长期持有:长期持有用关联,只在方法里临时用则依赖
  • 多重度必填:1、0..1、星号,缺多重度的关联容易让实现者误解

建模检查点

  • 每个关联都要能回答为什么两个对象需要长期相互引用
  • 组合关系要在数据库或对象映射里有对应的生命周期约束
  • 依赖关系不要画成关联,否则模型里会堆满噪音连线
  • 泛化层级建议不超过三层,超过时考虑用组合替代
  • 多重度必须与业务规则一致,例如一个订单允许几行明细

典型使用场景

  • 领域建模:把业务对象的结构关系固化到模型里
  • 代码评审:对照类图检查生命周期与级联删除是否一致
  • 遗留系统梳理:反向画出类关系,找出循环依赖
  • 团队沟通:统一表达方式,避免口头描述结构
聚合与组合的菱形永远画在整体一侧;方向画错会让实现者误解谁负责对象的创建与销毁。
依赖是六种关系里最弱的一种,只在方法参数、局部变量或静态调用中出现。如果两个类互相依赖,通常说明职责边界需要重新划分,而不是补一条双向箭头就能解决。

易错点

  • 把调用一次的依赖关系画成关联,模型里出现大量无意义连线
  • 模型里写了组合关系,数据库却没有外键或级联约束,语义与实现脱节
  • 忽略多重度,实现时把 0..1 当作 1 处理,空指针与脏数据随之而来
  • 泛化层级过深,父类承担不相关职责,子类被迫继承用不上的行为
  • 聚合被当成组合实现,删除整体时连带删掉本应独立存在的数据

数据来源与参考

  • OMG UML 2.5.1 规范
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌