组合和聚合java代码区别,给出实例代码
时间: 2025-01-03 18:36:52 浏览: 6
### Java中的组合与聚合
#### 组合关系
在面向对象设计中,组合表示一种强类型的“拥有”关系。在这种情况下,“整体”完全控制着“部分”的生命周期。“部分”不能独立存在;如果删除了“整体”,那么所有的“部分”也会被销毁[^1]。
```java
public class Engine {
private String type;
public Engine(String type) {
this.type = type;
}
@Override
public String toString() {
return "Engine{" +
"type='" + type + '\'' +
'}';
}
}
public class Car {
private final Engine engine;
public Car(Engine engine){
this.engine = engine;
}
// 不提供setter方法,因为发动机一旦设定就不能更改
@Override
public String toString(){
return "Car{engine=" + engine + "}";
}
}
```
在这个例子中,`Car`类包含了`Engine`实例作为其组成部分之一,并且通过构造函数注入的方式创建了一个不可变的对象结构。当不再需要汽车时,引擎也将随之消失——这就是典型的组合模式。
#### 聚合关系
相比之下,聚合是一种较弱形式的“拥有”。它允许组件之间保持松散耦合的状态:“整体”可以包含多个“部分”,但是这些“部分”可以在不同的时间加入或离开这个集体而不影响其他成员的存在状态。此外,“部分”还可以属于不止一个“整体”。
```java
import java.util.ArrayList;
import java.util.List;
class Department {
private List<Employee> employees = new ArrayList<>();
void addEmployee(Employee employee) {
employees.add(employee);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
for (var emp : employees) {
sb.append(emp).append("\n");
}
return sb.toString();
}
}
class Employee {
private String name;
public Employee(String name) {
this.name = name;
}
@Override
public String toString() {
return "Employee{name='" + name + "'}";
}
}
// 使用示例
Department dept = new Department();
dept.addEmployee(new Employee("Alice"));
dept.addEmployee(new Employee("Bob"));
System.out.println(dept); // 输出部门内员工列表
```
这里展示了如何在一个公司里建立部门和雇员之间的联系。即使某个特定的部门解散了,那些曾经隶属于它的职员仍然能够继续存在于系统之中并可能转移到另一个新的团队下工作。
阅读全文