组合模式用于处理树形结构的数据
组合模式(Composite Design Pattern)是将一组对象组织(Compose)成树形结构,以表示一种 部分 - 整体 的层次结构。
组合让调用者可以统一单个对象和组合对象的处理逻辑。
组织结构是个典型的组合模式
public abstract class HumanResource {
protected long id;
protected double salary;
public HumanResource(long id) {
this.id = id;
}
public long getId() {
return id;
}
public abstract double calculateSalary();
}
HumanResource
是部门类(Department
)和员工类(Employee
)抽象出来的父类,为的是能统一薪资的处理逻辑。
public class Employee extends HumanResource {
public Employee(long id, double salary) {
super(id);
this.salary = salary;
}
@Override
public double calculateSalary() {
return salary;
}
}
public class Department extends HumanResource {
private List<HumanResource> subNodes = new ArrayList<>();
public Department(long id) {
super(id);
}
@Override
public double calculateSalary() {
double totalSalary = 0;
for (HumanResource hr : subNodes) {
totalSalary += hr.calculateSalary();
}
this.salary = totalSalary;
return totalSalary;
}
public void addSubNode(HumanResource hr) {
subNodes.add(hr);
}
}
// 构建组织架构的代码
public class Demo {
private static final long ORGANIZATION_ROOT_ID = 1001;
private DepartmentRepo departmentRepo; // 依赖注入
private EmployeeRepo employeeRepo; // 依赖注入
public void buildOrganization() {
Department rootDepartment = new Department(ORGANIZATION_ROOT_ID);
buildOrganization(rootDepartment);
}
private void buildOrganization(Department department) {
List<Long> subDepartmentIds = departmentRepo.getSubDepartmentIds(department.getId());
for (Long subDepartmentId : subDepartmentIds) {
Department subDepartment = new Department(subDepartmentId);
department.addSubNode(subDepartment);
buildOrganization(subDepartment);
}
List<Long> employeeIds = employeeRepo.getDepartmentEmployeeIds(department.getId());
for (Long employeeId : employeeIds) {
double salary = employeeRepo.getEmployeeSalary(employeeId);
department.addSubNode(new Employee(employeeId, salary));
}
}
}
Demo
中的代码负责从数据库中读取数据并在内存中构建组织架构图。
将一组对象(员工和部门
)组织成树形结构,以表示一种‘部分 - 整体’的层次结构(部门与子部门的嵌套结构
)。组合模式让客户端可以统一单个对象(员工
)和组合对象(部门
)的处理逻辑(递归遍历
)。
组合模式的设计思路,与其说是一种设计模式,倒不如说是 对业务场景的一种数据结构和算法的抽象。其中,数据可以表示成树这种数据结构,业务需求可以通过在树上的递归遍历算法来实现。