Java中聚合与组合的区别

17 Mar 2025 | 6 分钟阅读

对象是现实世界中的一个实体,在编程或现实生活中,对象之间存在着相互关系。对象之间通过一种或多种关系相互关联,例如聚合、组合、关联等。

在深入了解这三种关系之前,让我们先来理解聚合和组合之间的区别。

组合 (Composition)

组合是一种“属于”类型的关系,其中一个对象与其他对象在逻辑上相关。它也被称为“has-a”(拥有)关系。我们可以使用以下示例来理解“has-a”“belong-to”

教室属于学校,或者说学校有一个教室。所以,称呼它们两者都取决于观点。

组合是一种更强的“has-a”关系,因为包含对象是它的所有者。因此,对象是紧密耦合的,这意味着如果我们删除父对象,子对象也会随之被删除。

让我们举一个例子来理解如何在Java中实现组合关系的逻辑。

CompositionExample.java

输出

Aggregation vs Composition in Java

聚合 (Aggregation)

聚合关系也是一种“has-a”关系。聚合和组合之间唯一的区别是,在聚合中,对象不是紧密耦合的,或者不涉及所有权。所有对象都是相互独立的,即使父对象被删除,它们也可以继续存在。让我们通过以下示例来理解这一点。

汽车配备有轮子,如果我们拆下它的轮子,轮子仍然会存在。但一辆没有轮子的汽车不像有轮子的汽车那么有用,这就是这种关系最初存在的目的,即将零件组装成一个能够执行比单个零件更多功能的更大的结构

让我们举一个例子来理解如何在Java中实现聚合关系的逻辑。

Address.java

AggregationExample.java

输出

Aggregation vs Composition in Java

关联 (Association)

关联不是“has-a”关系,是所有关系中最弱的一种。在关联关系中,没有任何对象是另一个对象的一部分或成员。母子关系是关联的一个简单例子。

让我们举一个例子来理解如何在Java中实现关联关系的逻辑。

AssociationExample.java

输出

Aggregation vs Composition in Java

聚合与组合的区别

让我们来理解聚合与组合的区别。

序号聚合 (Aggregation)组合 (Composition)
1.定义“has-a”关系的两个对象之间的关联称为聚合。聚合的一种特定类型,表示所有权,称为组合。
2.在聚合中,对象可以独立存在于系统范围之外。在组合关系中,对象不能独立于彼此存在于系统范围之外。
3.在聚合中,关联的对象是相互独立的。在组合中,对象是紧密耦合的或相互依赖的。
4.在聚合中,如果我们删除父对象,子对象仍然存在于系统中。例如,如果我们从汽车上取下轮子,汽车可以用另一个轮子正常运行。在组合中,如果我们删除父对象,子对象也会被删除。例如,如果我们删除一个文件夹,其中包含的文件也会被删除。
5.我们用实心菱形表示。我们用空心菱形表示。
6.在聚合中,子对象的生命周期不独立。在组合中,子对象的生命周期是独立的。
7.在聚合中,如果我们删除一个组件,它不会影响其零件。在拥有一个类的实例时,它会影响包含类对象。