类图中的组合和聚合

Posted

技术标签:

【中文标题】类图中的组合和聚合【英文标题】:Composition and Aggregation in a Class diagram 【发布时间】:2011-12-26 00:01:14 【问题描述】:

在设计类图时,我很难理解这些,据我所知,组合是一种“具有”关系,但聚合?我不知道它是什么。一件事我什么时候知道在类图中使用组合?我什么时候知道在类图中使用聚合?一个例子将不胜感激。

【问题讨论】:

【参考方案1】:

聚合和组合之间的主要区别在于“具有”关系的属性。它或强或弱。

聚合“has-a”关系属于“弱类型”。弱意味着聚合器的链接组件可以在聚合生命周期中存活,或者可以以其他方式访问。一个简单的例子是一个足球俱乐部及其成员。如果俱乐部解散了,您仍然拥有会员 - 事实上,这些会员也可能是其他俱乐部的会员,因此仍然存在。

组合“has-a”关系属于“强类型”。强烈的意思是没有另一个就不能存在。组件的生命周期直接链接到“父级”。一个例子是有房间的房子。如果你决定拆掉房子,你也会失去你的房间。

也许有点抽象,但我认为这就是它背后的想法。

【讨论】:

我忘了问,联想呢?【参考方案2】:

查看之前问题的答案here、here 和here。

我个人不使用聚合。语义太弱而无用。它带来的问题多于解决的问题。只有一个地方它具有明确定义且可能有用的属性,可以将其与简单的二元关联区分开来(见脚注)。

组合很有用,因为它定义了关于不变性和生命周期管理的重要属性(参见上面的第一个链接)。多年来我一直很高兴地生存下来,而无需使用聚合。

hth.

脚注。如果您需要对递归树关系进行建模,则可以使用聚合,例如一个部分递归地分解成子部分。聚合表示不能存在循环关系,即一部分不能直接或间接地成为其自身的子部分。然而,大多数阅读该模型的人不太可能知道这一点。 - 所以你需要添加评论。这意味着您最好坚持使用二元关联并避免使用聚合时的混淆。

【讨论】:

以上是关于类图中的组合和聚合的主要内容,如果未能解决你的问题,请参考以下文章

UML-类图详解(依赖关联聚合组合泛化实现)

UML-类图详解(依赖关联聚合组合泛化实现)

UML类图(下):关联聚合组合依赖

实现组合和聚合的最佳实践

UML系列:Class Diagram

java中的组合和聚合有啥区别? [复制]