65.9K
CodeProject 正在变化。 阅读更多。
Home

理解关联、聚合和组合

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.80/5 (118投票s)

2012年2月15日

CPOL

5分钟阅读

viewsIcon

720079

downloadIcon

7094

在本文中,我们将尝试理解三个重要的概念:关联、聚合和组合。

目录

引言

在本文中,我们将尝试理解三个重要的概念:关联、聚合和组合。

我们还将尝试了解在何种场景下需要它们。这三个概念确实让许多开发者感到困惑,在本文中,我将尝试通过一些现实世界的例子以简化的方式呈现这些概念。

从需求中提取现实世界的关系

面向对象编程的要点在于,您的代码会复制现实世界的对象,从而使您的代码易于阅读和维护。当我们说现实世界时,现实世界是有关系的。让我们考虑下面列出的简单需求

  1. 经理是 XYZ 有限公司的一名员工。
  2. 经理使用门禁卡进入 XYZ premises。
  3. 经理有在他的手下工作的下属。
  4. 经理有责任确保项目成功。
  5. 经理的薪酬将根据项目成功情况进行评定。

如果您仔细分析以上五点需求,我们可以轻松地可视化出四种关系:

  • 继承
  • 聚合
  • 关联
  • 组成

我们逐一理解它们。

需求 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:生命周期关系:组合

最后两个需求实际上是逻辑上等同的。如果您仔细阅读,需求如下:

  1. 经理有责任确保项目成功。
  2. 经理的薪酬将根据项目成功情况进行评定。

以下是从分析上述需求得出的结论:

  1. 经理和项目对象相互依赖。
  2. 两个对象的生命周期是相同的。换句话说,如果经理不好,项目就不会成功;如果项目有问题,经理也不会得到好的加薪。

下面是类的构成样子。您还可以看到,当我创建项目对象时,它需要经理对象。

这种关系被称为组合关系。在这种关系中,两个对象高度依赖彼此。换句话说,如果一个对象被垃圾回收,另一个对象也必须被垃圾回收,或者从另一个角度来看,对象的生命周期是相同的。这就是为什么我在标题中使用了“生命周期”关系。

整合

下面是需求中关系的视觉表示。

源代码

您可以下载本文的示例 源代码

总结

为了避免以后混淆这三个术语,我在下面提供了一个表格,它将帮助我们从三个角度进行比较:所有者、生命周期和子对象。

  关联 聚合 组成
Owner 无所有者 单一所有者 单一所有者
生命周期 拥有自己的生命周期 拥有自己的生命周期 所有者的生命周期
子对象 子对象都独立 子对象属于单个父级 子对象属于单个父级

关于关联、聚合和组合的详细视频

感谢您阅读我的文章。

如需进一步阅读,请观看以下面试准备视频和分步视频系列。

© . All rights reserved.