文章

浅谈依赖、关联、聚合和组合

面向对象编程中,依赖、关联、聚合和组合是描述对象之间关系的常用概念。它们具有不同的含义和强度,以下是对它们的详细说明以及示例说明:

依赖(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 进行授权