Composition(组合)与Aggregation(聚合)的区别

本文探讨了面向对象设计中的Composition(组合)与Aggregation(聚合)两种关系的区别。通过实例说明了它们在代码实现上的不同,以及如何根据具体场景选择合适的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Composition:组成,实心关系;

Aggregation:聚合,空心关系(可传递)。


之前划类图,对于二者的区别始终没有搞太明白,多数情况下都会选择使用Composition. 今天有时间就查阅了一些资料,把我新的理解在这里和大家分享一下:

1. 若论两种关系表示的强弱程度,Composition应该更强一些,这也是为什么在图中会以一个实心菱形来代表。反之,聚合使用的是空心菱形。见下图.



2. Composition表示的是'Part-of'的关系, 以图1为例,Engine是Car的一部分。脱离Car的Engine是没有实在意义的;而Aggregation表示的是'Has-a'的关系,以图2为例,Person有一个Address,但是Addess的存在是不依赖Person的,换句话说,地址本身就有其独立存在的意义,有没有人都是没有关系的。

3. 设计最终还是要落实到代码的,所以我们用代码来再次对比一下二者的区别。此处,我们用Engine与Address不同的生命周期来理解两种关系的区别。

[csharp]  view plain  copy
  1. public class Engine  
  2. {  
  3.  . . .   
  4. }  
  5.   
  6. public class Car  
  7. {  
  8.     Engine e = new Engine();  
  9.     .......  
  10. }  

上面的是Compostion, 下面的是Aggregation:

[csharp]  view plain  copy
  1. public class Address  
  2. {  
  3.  . . .  
  4. }  
  5.   
  6. public class Person  
  7. {  
  8.      private Address address;  
  9.      public Person(Address address)  
  10.      {  
  11.          this.address = address;  
  12.      }  
  13.      . . .  
  14. }  
从两个代码片段中,我们不难看出Engine的生命周期是与Car一致的,何时Car被回收了,那Engine也就不存在了。但是反观Address,它是在Person之外创建的,所以即使Person被回收了,Address也不一定马上也会回收。(取决于是否有指向它的其它链接) 

以上内容只是个人观点,欢迎大家补充或指正。实际设计中,定义两个类型之前的关系到底是Compostion还是Aggregation,可对比上例斟酌选择。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值