在Java(以及面向对象编程中),依赖、关联、组合和聚合是描述类之间关系的几个重要概念。这些概念帮助开发者理解和设计系统中对象之间的交互方式。下面是对这些概念的详细解释:
1. 依赖(Dependency)
依赖关系表示一个类(依赖者)依赖于另一个类(被依赖者)的定义或功能。在依赖关系中,被依赖的类发生变化时,可能会影响到依赖它的类。但是,这种关系通常不是通过类的属性来体现的,而是通过方法参数、局部变量或方法的返回值等形式来实现。
- 特点:临时性的、非必要的,仅在特定场景下存在。
- 代码示例:
在这个例子中,public class Driver { public void drive(Car car) { car.move(); } }
Driver
类依赖于Car
类来执行其drive
方法。但Driver
并没有直接拥有Car
类的实例。
2. 关联(Association)
关联关系表示两个或多个类之间存在某种联系,但这种联系弱于聚合和组合。关联可以是双向的,也可以是单向的。在关联关系中,一个类持有另一个类的引用(通过实例变量),但这种引用可以表示不同的含义,比如所有权、包含关系、依赖关系等。
- 特点:长期性的、可以是双向的。
- 代码示例:
在这个例子中,public class Person { private Address address; public Person(Address address) { this.address = address; } }
Person
类与Address
类之间存在关联关系,因为Person
类持有一个Address
类的实例。
3. 聚合(Aggregation)
聚合是一种特殊的关联关系,表示“整体-部分”的关系,但整体与部分之间是可分离的,即整体的生命周期不依赖于部分的生命周期。在聚合关系中,整体可以包含多个部分,但这些部分可以独立于整体存在。
- 特点:整体与部分是可分离的,整体的生命周期不控制部分的生命周期。
- 代码示例:
public class University { private List<Department> departments; public University() { departments = new ArrayList<>(); } public void addDepartment(Department department) { departments.add(department); } }
University
与Department
之间是聚合关系,因为Department
可以独立于University
存在。
4. 组合(Composition)
组合也是一种特殊的关联关系,同样表示“整体-部分”的关系,但整体与部分之间是不可分离的,即整体的生命周期控制着部分的生命周期。在组合关系中,如果整体被销毁,那么其包含的部分也会被销毁。