聚合与组合的区别

原文链接:http://www.blogjava.net/lukangping/archive/2010/08/01/327693.html

红色部分为本文转载时添加的。


聚合:表示两个对象之间是整体和部分的关系,部分的生命周期可以超越整体。如电脑和鼠标,就可以用一下图形表示:




组合:表示两个对象之间是整体和部分的关系,部分的生命周期不能超越整体,或者说不能脱离整体而存在。组合关系的“部分”,是不能在整体之间进行共享的。如人和眼睛的关系:



不过,如果你要说,眼睛可以移植,是不是说可以脱离人而存在,它们就不是组合关系了?其实,UML中对象的关系都是在相应的软件环境或实际场景下定义的,这里区别聚合和组合的关系,关键还是在于它们之中整体和部分的关系强、弱,以及它们之间的依附关系。如果刚才说眼睛可以移植给别人,那你也可以把它认为是聚合,这都要结合实际场景来说明。

另外两个比较重要的关系是关联和依赖:
关联:简单的可以认为,如果一个类作为了另外一个类的属性,那一定是关联关系。但你要知道,聚合是一种特殊的关联,而组合又是一种特殊的聚合。一般的关联我们认为是平级的、无整体部分关系的,如朋友关系。

依赖:对象之间的临时关系,临时性体现在不超越方法的周期。简单的说,在方法使用到的,如参数类,就一定是依赖关系。

最后想说一句,实际工作中,我并没有发现区分这四种关系有多么大的用处,也许自己还没有碰到,只是觉得可能每个学习它的同学总想把它搞清楚,但实际工作中作用并不明显。



关于Viso中画聚合:

先选择组合的实心菱形,然后在那条线上,点击右键-格式-线条,右上角的线条端点-起点那里,现在应该是Composite。你把它改成Shared就可以了~下

### 区别分析 #### 所有权生命周期 组合(Composition)是一种强“拥有”关系,体现的是部分整体之间的严格依赖。在这种关系中,内部对象(部分)的生命周期完全依赖于外部对象(整体)。当外部对象被销毁时,内部对象也会随之销毁。这种关系强调的是不可分割的整体性,例如一个`Computer`对象包含一个`VoiceBox`对象,并且`VoiceBox`无法独立存在[^5]。 聚合(Aggregation)则是一种弱“拥有”关系,内部对象可以独立存在,并且可以在多个外部对象之间共享。外部对象并不控制内部对象的生命周期,例如一个`Computer`对象可以引用一个`VoiceBox`对象,但`VoiceBox`可以在`Computer`被销毁后继续存在[^2]。 #### 设计实现 在面向对象的设计中,组合通常通过直接包含对象实例来实现。例如,类`Computer`中直接包含一个`VoiceBox`实例,这种设计表明`VoiceBox`是`Computer`不可分割的一部分[^5]。 聚合则通常通过引用或指针来实现。例如,类`Computer`中包含一个指向`VoiceBox`的指针,这种设计表明`VoiceBox`可以独立存在,并且可以被多个`Computer`对象共享[^2]。 #### UML表示 在UML图中,组合关系用带有实心菱形的直线表示,菱形靠近整体类,表示整体对部分的强依赖。聚合关系则用带有空心菱形的直线表示,菱形靠近整体类,表示整体对部分的弱依赖[^3]。 ### 示例代码 ```cpp #include "Computer.h" #include "VoiceBox.h" void test(VoiceBox *box) { // 组合是整体部分的关系,同生共死的 Computer computer("Intel", "i7", 16, 512); // 聚合不是同生共死的关系,当电脑坏了之后音响还是可以继续使用 computer.addBox(box); } int main() { VoiceBox box; test(&box); system("pause"); return 0; } ``` ### 总结 组合聚合都是面向对象设计中用于描述类之间关系的重要概念,但它们在所有权和生命周期上有显著区别组合表示强的依赖关系,部分整体共存亡;而聚合表示弱的依赖关系,部分可以独立存在并在多个整体中共享[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值