Java 中的关联 vs. 聚合 vs. 组合

2024 年 9 月 10 日 | 阅读 7 分钟

在面向对象编程 (OOP) 中,将类连接在一起是至关重要的组成部分,它构成了一个复杂的互联网络。Java 引入了支撑这些交互的三种基本概念:**关联 (association)、聚合 (aggregation) 和组合 (composition)**。这些概念不仅是课堂讨论的基础,也是开发灵活且可维护软件的关键。

关联:连接类

在庞大的 Java 世界中,关联是类之间链接的基础。它描述了一对一、一对多或多对多的复杂关系,超越了简单的连接。考虑以下特征来理解关联的细微之处:

关联的特征

1. 多重性 (Multiplicity)

  • 关联定义了一个类的实例与另一个类的实例之间的关系,并且可以采取不同的多重性。这可以是“一对多”或“多对多”,用于更复杂的关系。“一对一”表示单个链接。

2. 方向性 (Directionality)

  • 关联可以是单向的,也可以是双向的。单向关联鼓励单向连接,这意味着一个类知道另一个类。另一方面,双向关联通过表示两个类之间的共享理解来建立双向通信。

3. 导航 (Navigation)

  • 通过方法调用或直接访问属性,必须在类之间进行导航。这种动态交互是构建具有灵活类关系的复杂系统的基础。

Association.java

输出

Enter branch name of the student
CSE
Enter name of the student 
RAM
RAM is a student of CSE

聚合:整体-部分关系

一种更复杂的连接类型是聚合,它表示一种“整体-部分”关系,其中实体由独立的部分组成。与关联不同,聚合表示更强的联系,并允许组件独立运行。考虑以下特征来理解聚合交响曲的细微之处:

聚合的特征

1. 所有权 (Ownership)

聚合体现了一种复杂的归属感。“整体”类与“部分”类保持关联,但并不拥有绝对的控制权。不同的整体可以共享部分,从而实现共享和动态交互。

2. 灵活性 (Flexibility)

这种类型的连接提供了适应性。可以轻松添加或删除部分或组件,而不会破坏整体框架。这种灵活性在许多软件设计场景中至关重要。

3. 生命周期 (Lifecycle)

在聚合的领域内,组件的生命周期可能与整体的生命周期分开。它们为设计增加了复杂性,并且可以先于或晚于整个实体创建或销毁而存在。

Car.java

输出

Car Model: Sedan
Engine Fuel Type: Petrol

组合 (Composition)

在聚合的领域内,组合表现为一种更严格的形式,其中每个元素都完全依赖于整体的存在。由于它们紧密的联系,组成部分和整体一起被创建,最重要的是,一起被销毁。让我们研究一下定义这种相互依赖性的特征:

组合的特征

1. 所有权和生命周期 (Ownership and Lifecycle)

  • 组合引入了一种强烈的归属感。“整体”类负责“部分”类的创建和销毁,同时也拥有它。它们紧密交织的生命周期促进了和谐共生的交互。

2. 责任 (Responsibility)

  • 整体组合负责控制其组成部分的行为和生命周期。这种增强的责任感使得结构更加紧密,相互依赖性更高。

3. 不可变性 (Immutability)

  • 在某些情况下,组合会导致不可变性。实体一旦完全形成,其组成部分就变得不可变,从而加强了结构并防止了更改。

Human.java

输出

Alice is walking.
Heart is beating.

用例

关联 (Association)

当类之间存在通用关系,但所有权或依赖性较小时,使用关联。

聚合 (Aggregation)

当一个类代表另一个类的集合,但每个部分都可以独立存在时,使用聚合。

组合 (Composition)

当组件对整体至关重要且具有紧密联系的生命周期时,使用组合。

特性关联 (Association)聚合 (Aggregation)组合 (Composition)
关系类型两个或多个类之间的通用关系。“整体-部分”关系,其中部分可以独立存在。“整体-部分”关系,具有更强的联系,部分依赖于整体。
依赖级别较低依赖:类可以独立存在。中度依赖:部分可以独立于整体存在。较高依赖;部分与整体一同被销毁。
代码重用性高:类可以在不同上下文中重用。中度:部分可以在不同整体中重用。低:为特定整体设计的特定组件。
灵活性高:一个类的更改不一定会影响另一个类。中度:部分的变化可能会影响整体,反之亦然。低:一个组件的变化可能对整体产生重大影响。
示例Student 和 Branch 类形成基本关系。Car 和 Engine 类,其中 Engine 是 Car 的一部分。Human 和 Heart 类,其中 Heart 是 Human 的一个组成部分。
代码表示没有特定的关键字,只是不同类的对象在交互。使用类变量来表示部分和整体。使用类变量并在构造函数中实例化以创建组合。
代码复杂度低:类之间的简单关系。中度:管理部分与整体之间的关系。高:管理依赖关系并确保正确销毁。

结论

  1. 关联 (Association):它通过表示依赖性较小的类之间的通用关系来促进代码重用性和灵活性。
  2. 聚合 (Aggregation):它表示一种稍有依赖的“整体-部分”关系。部分可以独立运行,并在其他场景中重用。
  3. 组合 (Composition):它创建了一种更依赖、更强的“整体-部分”关系。部分共同销毁的特性创造了更强的联系,但代码重用性较低。

根据特定需求和给定设计中类之间的交互,可以选择关联、聚合和组合。每种方法对于构建可靠且可管理的 Java 面向对象系统都至关重要。