OOP 中的组合、聚合和关联

简介: 【8月更文挑战第22天】

组合、聚合和关联是面向对象编程 (OOP) 中表示对象之间关系的三种主要类型。理解这三种关系之间的区别对于编写健壮且可维护的代码至关重要。

组合

组合是一种强关联类型,其中一个对象(称为整体)拥有另一个对象(称为部分)的生命周期。这意味着当整体对象被销毁时,部分对象也会被销毁。部分对象与整体对象之间存在依赖关系,并且不能独立于整体对象存在。

聚合

聚合是一种弱关联类型,其中一个对象(称为容器)包含另一个对象(称为内容)。容器对象不拥有内容对象的生命周期,内容对象可以独立于容器对象存在。容器对象与内容对象之间存在“拥有”关系,但内容对象并不依赖于容器对象。

关联

关联是一种最弱的关联类型,其中两个对象之间存在直接或间接的引用。关联对象之间没有所有权或包含关系。关联对象可以独立于彼此存在,并且可以随时断开关联。

比较

特征 组合 聚合 关联
生命周期 部分依赖于整体 内容独立于容器 对象独立
所有权 整体拥有部分 容器不拥有内容 无所有权
依赖性 部分依赖于整体 内容不依赖于容器 对象相互独立
表示 部件是整体的一部分 部件属于容器 部件与整体有联系

示例

  • 组合:汽车和轮胎。轮胎是汽车的一部分,当汽车被销毁时,轮胎也会被销毁。
  • 聚合:大学和学生。学生属于大学,但他们可以独立于大学存在。
  • 关联:客户和订单。客户和订单之间存在关联,但它们彼此独立。

何时使用

组合:

  • 当一个对象是另一个对象不可分割的一部分时。
  • 当一个对象的生命周期依赖于另一个对象时。

聚合:

  • 当一个对象包含另一个对象时。
  • 当一个对象与另一个对象有“拥有”关系时。

关联:

  • 当两个对象之间存在直接或间接的引用时。
  • 当两个对象相互独立时。

注意事项

  • 组合和聚合是“has-a”关系,而关联是“knows-about”关系。
  • 组合是最强的关联类型,聚合是介于组合和关联之间的类型。
  • 不同的编程语言可能对组合、聚合和关联有不同的实现。

结论

组合、聚合和关联是 OOP 中表示对象之间关系的重要概念。了解这三种关系之间的区别有助于开发人员创建更清晰、更可维护的代码。通过选择正确的关联类型,开发人员可以确保对象之间的关系准确地表示,并防止不必要的依赖和生命周期问题。

目录
相关文章
|
Java
Java 对象间关系(依赖、关联、聚合和组合)
面向对象设计 对象间关系:依赖、关联、聚合和组合,四种关系容易混淆。特别后三种,只是在语义上有所区别,所谓语义就是指上下文环境、特定情景等。 
1829 1
|
3月前
|
SQL 存储 监控
避坑必看!MySQL 三大日志(redo/undo/binlog)底层原理全拆解,事务一致性再也不懵
MySQL事务ACID的基石是redo、undo、binlog三大日志:redo log保障持久性(宕机不丢数据),undo log保障原子性(支持回滚与MVCC),binlog保障可追溯与主从同步。三者协同工作,缺一不可。
629 4
|
SQL 机器学习/深度学习 存储
七大经典技术场景!Apache Flink 在多维领域应用的 40+ 实践案例
随着 Apache Flink 自身的发展,越来越多的企业选择 Apache Flink 应用于自身的业务场景,如底层平台建设、实时数仓、实时推荐、实时分析、实时大屏、风控、数据湖等场景中,解决实时计算的需求。
七大经典技术场景!Apache Flink 在多维领域应用的 40+ 实践案例
|
7月前
|
数据采集 人工智能 弹性计算
"AI+云"赋能:基于PAI平台快速训练专属的图片识别模型
阿里云PAI平台融合AI与云计算,提供从数据标注到模型部署的全流程图片识别训练服务。支持弹性计算、可视化建模与多行业解决方案,助力开发者高效构建定制化模型,推动零售、工业、医疗等智能升级。
|
安全 调度 C++
C++ std::chrono库使用指南 (实现C++ 获取日期,时间戳,计时等功能)(二)
C++ std::chrono库使用指南 (实现C++ 获取日期,时间戳,计时等功能)
1675 0
|
12月前
|
人工智能 运维 安全
世界500强也在用!这家石化巨头如何平滑上云?
石化企业从Hyper-V转型上国产私有云案例分享,轻松实现智能升级!
326 0
世界500强也在用!这家石化巨头如何平滑上云?
|
数据处理 数据安全/隐私保护 流计算
Flink 三种时间窗口、窗口处理函数使用及案例
Flink 是处理无界数据流的强大工具,提供了丰富的窗口机制。本文介绍了三种时间窗口(滚动窗口、滑动窗口和会话窗口)及其使用方法,包括时间窗口的概念、窗口处理函数的使用和实际案例。通过这些机制,可以灵活地对数据流进行分析和计算,满足不同的业务需求。
1977 27
|
编译器 Linux C语言
C/C++ 常见函数调用约定(__stdcall,__cdecl,__fastcall等):介绍常见函数调用约定的基本概念、用途和作用
C/C++ 常见函数调用约定(__stdcall,__cdecl,__fastcall等):介绍常见函数调用约定的基本概念、用途和作用
1549 0
|
存储 Serverless Python
`quad()` 函数是 `scipy.integrate` 模块中的一个函数,用于计算一维函数的数值积分。其基本语法如下:
`quad()` 函数是 `scipy.integrate` 模块中的一个函数,用于计算一维函数的数值积分。其基本语法如下:
深入理解Linux中的cp命令:文件与目录的复制利器
深入理解Linux中的cp命令:文件与目录的复制利器