组合模式(Composite Pattern) 是 结构型设计模式 之一,它用于处理树形结构,让客户端可以一致地对待单个对象和对象的组合。
1. 组合模式的核心思想
• 适用于树形结构(如组织架构、文件系统、GUI 组件)。
• 统一单个对象(叶子节点)和组合对象(容器节点)的操作。
• 让客户端无需关心是单个对象还是组合对象,可以一致地调用它们的方法。
2. 代码示例(Java 实现)
假设我们要设计一个 公司员工管理系统,其中:
• Employee(员工)是一个通用接口。
• Manager(经理)可以管理多个员工(包括普通员工和其他经理),形成树状结构。
• Developer(开发人员)是普通员工,不能再管理其他人。
(1)定义组件接口
// 组件接口:定义通用操作
public interface Employee {
void showDetails(); // 展示员工信息
}
(2)创建叶子节点(普通员工)
// 叶子节点:开发人员
public class Developer implements Employee {
private String name;
private String position;
public Developer(String name, String position) {
this.name = name;
this.position = position;
}
@Override
public void showDetails() {
System.out.println("开发人员: " + name + ", 职位: " + position);
}
}
(3)创建组合节点(管理者)
import java.util.ArrayList;
import java.util.List;
// 组合节点:经理
public class Manager implements Employee {
private String name;
private String position;
private List<Employee> subordinates = new ArrayList<>(); // 下属员工列表
public Manager(String name, String position) {
this.name = name;
this.position = position;
}
// 添加下属
public void addEmployee(Employee employee) {
subordinates.add(employee);
}
// 移除下属
public void removeEmployee(Employee employee) {
subordinates.remove(employee);
}
@Override
public void showDetails() {
System.out.println("经理: " + name + ", 职位: " + position);
for (Employee employee : subordinates) {
employee.showDetails(); // 递归展示所有下属
}
}
}
(4)测试组合模式
public class CompositePatternTest {
public static void main(String[] args) {
// 创建开发人员
Employee dev1 = new Developer("Alice", "Java 开发");
Employee dev2 = new Developer("Bob", "前端开发");
// 创建经理,并添加下属
Manager manager1 = new Manager("Charlie", "研发经理");
manager1.addEmployee(dev1);
manager1.addEmployee(dev2);
// 创建更高级经理,并管理多个经理
Manager generalManager = new Manager("David", "技术总监");
generalManager.addEmployee(manager1);
// 展示公司组织结构
generalManager.showDetails();
}
}
(5)运行结果
经理: David, 职位: 技术总监
经理: Charlie, 职位: 研发经理
开发人员: Alice, 职位: Java 开发
开发人员: Bob, 职位: 前端开发
✅ 组合模式让我们能够统一管理不同层级的对象!
3. 组合模式 vs. 其他模式
|
设计模式 |
作用 |
适用场景 |
|---|---|---|
|
组合模式 |
处理树形结构,统一管理单个对象和组合对象 |
组织架构、GUI 组件、文件系统 |
|
装饰器模式 |
动态添加功能 |
扩展已有对象的行为(如 I/O 流) |
|
策略模式 |
选择不同的算法 |
不同支付方式、排序算法 |
4. Spring 框架中的应用
• Spring Security 的 CompositeFilter 允许多个安全过滤器组合在一起。
• Spring AOP 允许多个切面(Advice)形成层级调用链。
• Spring MVC 的 HandlerMapping 可以管理多个 Handler。
5. 总结
• 组合模式适用于树形结构,如组织架构、GUI 组件、文件系统等。
• 统一单个对象(叶子节点)和组合对象(容器节点)的操作,让客户端无须关心对象层级。
• Spring 框架和很多企业级应用中都广泛使用组合模式。
浙公网安备 33010602011771号