理解关联、聚合和组合






4.80/5 (118投票s)
在本文中,我们将尝试理解三个重要的概念:关联、聚合和组合。
目录
- 引言
- 从需求中提取现实世界的关系
- 需求 1:IS A 关系
- 需求 2:使用关系:关联
- 需求 3:与父级的使用关系:聚合
- 需求 4 和 5:生命周期关系:组合
- 整合
- 源代码
- 总结
- 关于关联、聚合和组合的视频
引言
在本文中,我们将尝试理解三个重要的概念:关联、聚合和组合。
我们还将尝试了解在何种场景下需要它们。这三个概念确实让许多开发者感到困惑,在本文中,我将尝试通过一些现实世界的例子以简化的方式呈现这些概念。
从需求中提取现实世界的关系
面向对象编程的要点在于,您的代码会复制现实世界的对象,从而使您的代码易于阅读和维护。当我们说现实世界时,现实世界是有关系的。让我们考虑下面列出的简单需求
- 经理是 XYZ 有限公司的一名员工。
- 经理使用门禁卡进入 XYZ premises。
- 经理有在他的手下工作的下属。
- 经理有责任确保项目成功。
- 经理的薪酬将根据项目成功情况进行评定。
如果您仔细分析以上五点需求,我们可以轻松地可视化出四种关系:
- 继承
- 聚合
- 关联
- 组成
我们逐一理解它们。
需求 1:IS A 关系
如果您看第一个需求(经理是 XYZ 有限公司的一名员工),它是一种父子关系或继承关系。上面的句子说明经理是一种员工,换句话说,我们将有两个类:父类 `Employee`,以及继承自 `Employee` 类的子类 `Manager`。
注意:本文的范围仅限于聚合、关联和组合。本文不讨论继承,因为它相当直接,我相信您可以在网上找到数千篇有助于您理解它的文章。
需求 2:使用关系:关联
需求 2 是一个有趣的需求(经理使用门禁卡进入 XYZ premises)。在这个需求中,经理对象和门禁卡对象相互使用,但它们有自己的生命周期。换句话说,它们可以独立存在。这种关系最重要的点是,没有单一的所有者。
上面的图显示了 `SwipeCard` 类如何使用 `Manager` 类,以及 `Manager` 类如何使用 `SwipeCard` 类。您还可以看到我们如何独立创建 `Manager` 类和 `SwipeCard` 类的对象,并且它们可以拥有自己的生命周期。
这种关系称为“关联”关系。
需求 3:与父级的使用关系:聚合
列表中的第三个需求(经理有在他的手下工作的下属)表示与关联相同的关系类型,但有一个区别,就是其中一个拥有所有权。因此,根据需求,`Manager` 对象将拥有 `Worker` 对象。
子 `Worker` 对象不能属于任何其他对象。例如,`Worker` 对象不能属于 `SwipeCard` 对象。
但是……`Worker` 对象可以拥有与 `Manager` 对象完全无关的自己的生命周期。从不同的角度看,这意味着如果 `Manager` 对象被删除,`Worker` 对象也不会消失。
这种关系被称为“聚合”关系。
需求 4 和 5:生命周期关系:组合
最后两个需求实际上是逻辑上等同的。如果您仔细阅读,需求如下:
- 经理有责任确保项目成功。
- 经理的薪酬将根据项目成功情况进行评定。
以下是从分析上述需求得出的结论:
- 经理和项目对象相互依赖。
- 两个对象的生命周期是相同的。换句话说,如果经理不好,项目就不会成功;如果项目有问题,经理也不会得到好的加薪。
下面是类的构成样子。您还可以看到,当我创建项目对象时,它需要经理对象。
这种关系被称为组合关系。在这种关系中,两个对象高度依赖彼此。换句话说,如果一个对象被垃圾回收,另一个对象也必须被垃圾回收,或者从另一个角度来看,对象的生命周期是相同的。这就是为什么我在标题中使用了“生命周期”关系。
整合
下面是需求中关系的视觉表示。
源代码
您可以下载本文的示例 源代码。
总结
为了避免以后混淆这三个术语,我在下面提供了一个表格,它将帮助我们从三个角度进行比较:所有者、生命周期和子对象。
关联 | 聚合 | 组成 | |
Owner | 无所有者 | 单一所有者 | 单一所有者 |
生命周期 | 拥有自己的生命周期 | 拥有自己的生命周期 | 所有者的生命周期 |
子对象 | 子对象都独立 | 子对象属于单个父级 | 子对象属于单个父级 |
关于关联、聚合和组合的详细视频
感谢您阅读我的文章。
如需进一步阅读,请观看以下面试准备视频和分步视频系列。