知识卡片
聚合与组合的语义差异
内容
聚合(aggregation)口头上是”……的一部分”的关系,但UML里几乎没有严格语义——不同建模者对它的理解从来不一致,Jim Rumbaugh干脆称它为”建模安慰剂”,作者建议直接在图中忽略聚合,看到别人图里的聚合要挖得更深才能确认含义。组合(composition)则有明确规则:”无分享”:任何实例只能有唯一的拥有者,即便一个类可以是多个类的潜在组件类型,具体到某个实例也只能被一个对象拥有;拥有者被删除时,它拥有的组件也应级联删除。组合适合表达按值拥有、值对象或强排他所有权的关系。
结构图:
flowchart TD
A[聚合 aggregation] -->|口头语义: 部分-整体| B[UML几乎无严格约束]
B --> C[作者建议: 图中忽略/深挖具体含义]
D[组合 composition] -->|无分享规则| E[实例只能有唯一拥有者]
D -->|级联规则| F[拥有者删除时组件一并删除]
E --> G[适合值对象/强排他所有权]
F --> G
参考来源
- 位置:《UML精粹:标准对象建模语言简明指南(第3版)》第5章《类图:进阶概念》(源文件:_epub-src/EPUB/4.xhtml)
- 结论依据:原文引用Jim Rumbaugh的话"把它看做建模安慰剂"来描述聚合缺乏严格语义,并明确组合的规则"任何实例都必须是唯一拥有者的组件"以及"另一个假设是,如果你删除Polygon,它应该自动地确保任何它所拥有的Point也被删除"。
- 原始内容:UML把聚合……包含进来,但几乎没有任何语义。正如Jim Rumbaugh所说:"把它看做建模安慰剂。"……通用规则是,虽然一个类可以是许多其他类的组件,但任何实例都必须是唯一拥有者的组件……"无分享"规则是组合的关键。另一个假设是,如果你删除Polygon,它应该自动地确保任何它所拥有的Point也被删除。