聚合和组合

博客介绍了对象间的聚合和组合关系。聚合是松散关系,如计算机与外围设备,部分可独立存在,所有权可共享;组合是强关系,如树与树叶,部分与整体生命周期相同,组成负责部分的创建与销毁。

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

聚合(Aggregation):

   这是一种松散的对象间的关系.举个例子:计算机和他的外围设备就是一例.

  用来表示拥有关系或者整体与部分的关系。

组合(Composition):

这是一种非常强的对象间的关系,举个例子,树和它的树叶之间的关系.

在一个合成里,部分与整体的生命周期都是一样的。一个合成的新对象完全拥有对其组成

部分的支配权。包括他们的创建和毁灭。

最后总结一下:

聚合:

  •  聚合有时能够不依赖部分而存在,有时又不能
  • 部分可以独立于聚合而存在
  • 如果有一部分遗失,聚合会给人一种不完全的感觉
  • 部分的所有权可以由几个聚合来共享,比如打印机

合成:

  • 部分某一时刻只能属于某一个组成
  • 组成唯一的负责处理它的所有部分--这就意味着负责他们的创建与销毁
  • 倘若对于部分的职责由其他对象来承担的话,组成也就可以放松这些职责。
  • 如果组成销毁的话,它必须销毁所有的部分,或者把负责他们的权利转移给其他对象。
### 聚合组合关系的区别及应用场景 #### 定义区分 聚合组合都是面向对象设计中用来描述“整体-部分”关系的设计模式,但它们的本质区别在于对象间的依赖程度以及生命周期管理方式。 - **聚合**表示一种较弱的“整体-部分”关系,在这种情况下,“部分”对象可以在脱离“整体”的情况下独立存在[^4]。例如,一辆汽车与其驾驶员的关系可以被看作是聚合:即使没有特定的汽车实例,驾驶员仍然能够单独存在。 - **组合**则代表了一种更为紧密的“整体-部分”关系。“部分”对象的生命周期完全由“整体”控制,一旦“整体”销毁,则其所有的“部分”也会随之消失。比如,一个公司部门及其员工之间的关系属于组合:如果某个部门解散了,那么该部门下的所有员工也应重新分配或者不再隶属于这个部门。 #### 生命周期管理差异 在聚合的情况下,组件(即“部分”)拥有自己的生存周期,并不严格受限于容器(即“整体”)。这意味着即便删除掉某个集合体之后,它的成员依然可能继续存在于程序运行环境中[^1]。 而在组合结构里,当父级元素被摧毁时,它所包含的所有子节点都会自动清除,因为这些子节点的存在意义仅仅是为了服务于那个特定的父亲实体[^2]。 #### 应用场景举例说明 对于何时选用哪种形式来构建我们的应用程序逻辑层面上来说: - 如果我们希望创建一些相对固定的内部构成单元,并且这些组成部分不应该也不允许离开主体而独自存活下去的话,就应该采用组合策略。典型例子如文件夹与文档之间——每份文档都必须归属于某一层目录之下才能有意义地存储起来[^5]; ```java public class Folder { private List<Document> documents; public void addDocument(Document doc){ this.documents.add(doc); } // Other methods... } public class Document{ String content; Date creationDate; // Constructor and other methods... } ``` - 反之,当我们遇到那些虽然当前暂时联系在一起但实际上各自具备完整性的个体事物的时候就可以考虑运用聚合手法来进行处理。像学校里的教师队伍同各个班级学生群体相互作用的情形就非常适合利用这种方式表达出来[^3]。 ```java public class Teacher { private Set<Classroom> classrooms; public void assignToClass(Classroom classroom){ this.classrooms.add(classroom); } // Additional properties & functions ... } public class Classroom { int roomNumber; List<Student> studentsList; // Initialization code plus more features here .. } ``` #### 设计考量因素总结 为了达到良好的软件工程实践效果,在决定使用何种类型的关联之前应当仔细权衡以下几个方面的问题: - 是否有必要建立如此亲密无间式的绑定? - 预期目标系统未来可能发生怎样的变化趋势? - 如何平衡好重用性与复杂度两者之间的矛盾冲突? 通过上述讨论可以看出,尽管二者表面上看似相似,但在深层次上却存在着本质上的不同之处。因此,在实际开发过程中要根据具体情况灵活选取最合适的方案加以实施才是明智之举。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值