浅谈依赖、关联、聚合和组合
面向对象编程中,依赖、关联、聚合和组合是描述对象之间关系的常用概念。它们具有不同的含义和强度,以下是对它们的详细说明以及示例说明:
依赖(Dependency)
- 依赖表示一个对象(或类)在执行过程中需要另一个对象(或类)的支持或协助。它描述了一个对象(或类)对另一个对象(或类)的依赖关系。
- 依赖关系通常体现在一个对象(或类)通过参数、方法调用、接口实现等方式使用另一个对象(或类)提供的功能或服务。一个对象(或类)的改变可能会影响到依赖它的对象(或类)的行为。
- 依赖是一种较弱的关系,被依赖的对象(或类)可以在独立于依赖它的对象(或类)的情况下存在。
示例:一个电商平台的订单类(Order)依赖于支付类(Payment),在订单处理过程中需要使用支付功能来完成付款操作。订单类在某个方法中会调用支付类提供的付款方法。
关联(Association)
- 关联表示不同对象之间的关系或连接,可以是双向的或单向的。对象之间的关联可以通过成员变量、方法参数或返回值等方式来表示。
- 关联关系通常用于表示对象之间的交互和通信,而不涉及依赖的具体实现。
- 关联关系可以是强关联或弱关联,强关联表示两个对象之间存在较强的关系,一个对象的改变可能会影响另一个对象。弱关联表示两个对象之间的联系相对较弱,一个对象的改变不会直接影响另一个对象。
示例:一个学校类(School)和教师类(Teacher)之间存在关联关系。学校类可以有一个成员变量来存储教师对象的列表,表示学校与教师之间的联系。教师对象可以访问学校对象以获取学校的相关信息。
聚合(Aggregation)
- 聚合表示一种“整体-部分”的关系,其中一个对象(整体)包含了另一个对象(部分),被包含的对象可以独立于整体存在。
- 聚合是一种弱关联关系,被包含的对象可以属于多个整体对象,可以在整体对象之间共享。
- 聚合关系体现了对象之间的整体与部分之间的关系,其中部分对象可以存在独立于整体对象的情况下。
示例:继续上述的聚合示例,一个部门类(Department)和员工类(Employee)之间存在聚合关系。部门可以包含多个员工,而员工可以属于一个或多个部门。部门可以存在独立于员工的情况下,员工也可以在不同的部门之间共享。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Department {
private List<Employee> employees;
public Department() {
employees = new ArrayList<>();
}
public void addEmployee(Employee employee) {
employees.add(employee);
}
// 其他部门相关的方法和属性
}
class Employee {
private String name;
public Employee(String name) {
this.name = name;
}
// 员工的其他属性和方法
}
在这个示例中,Department类包含了一个员工列表,表示部门与员工之间的聚合关系。一个部门可以包含多个员工,而员工可以独立于部门存在。Department类通过addEmployee()方法来添加员工对象到部门的员工列表中。
组合(Composition)
- 组合是一种比聚合更强的“整体-部分”关系,其中一个对象(整体)包含了另一个对象(部分),被包含的对象的生命周期与整体对象的生命周期相依赖。
- 在组合关系中,部分对象不能独立于整体对象存在,如果整体对象被销毁,部分对象也会被销毁。
- 组合关系体现了强耦合的对象关系,整体对象负责创建和管理部分对象。
示例:一个汽车类(Car)和引擎类(Engine)之间存在组合关系。汽车对象包含了一个引擎对象,引擎对象的生命周期与汽车对象的生命周期相依赖。如果汽车对象被销毁,引擎对象也会被销毁。
1
2
3
4
5
6
7
8
9
10
11
12
13
class Car {
private Engine engine;
public Car() {
engine = new Engine();
}
// 其他汽车相关的方法和属性
}
class Engine {
// 引擎的属性和方法
}
在这个示例中,Car类包含了一个Engine对象,表示汽车与引擎之间的组合关系。Car对象创建时会同时创建Engine对象,并负责管理和控制引擎对象的生命周期。
总结
- 依赖表示一个对象对另一个对象的功能或服务的依赖性。
- 关联表示对象之间的连接或关系。
- 聚合表示一个对象包含另一个对象,被包含的对象可以独立于整体存在。
- 组合表示一个对象包含另一个对象,并且被包含的对象的生命周期与整体对象的生命周期相依赖。
这些概念和关系描述了对象之间的不同关系类型,帮助我们更好地建模和理解
本文由作者按照 CC BY 4.0 进行授权