组合模式
一、介绍
将对象组合成树形结构以表示“部分-整体”的层次关系。组合模式使得用户对单个对象和组合对象的使用都是相同的。
组合模式主要由以下几个部分构成:
- Component(组件):定义了叶子节点和组合节点的公共接口,可以包含一些默认的行为或属性。
- Leaf(叶子节点):表示树中的叶子结点对象,叶子结点没有子节点。
- Composite(组合节点):表示树中的组合结点对象,它可以拥有子节点,并且实现了与 Component 相关的操作。
二、人员管理系统使用案例
需求:人员管理系统,要求能够管理公司中的员工和部门,同时能够展示整个公司的组织架构。
- 组件:Person接口表示
人员
// 1. 定义接口
public interface Person {
void displayDetails();
}
- 叶子节点:Employee类表示
员工类
,实现了Person接口
// 2. 实现叶子节点
public class Employee implements Person {
private String name;
public Employee(String name) {
this.name = name;
}
@Override
public void displayDetails() {
System.out.println("Employee: " + name);
}
}
- 组合节点:Department类表示
部门类
,实现了Person接口。在Department类中包含一个列表用于存储人员Person对象。部门类中实现addPerson添加
、removePerson删除员工和部门
的功能,并实现展示公司组织架构的displayDetails
方法。
// 3. 创建组合节点
import java.util.ArrayList;
import java.util.List;
public class Department implements Person {
private String name;
private List<Person> people;
public Department(String name) {
this.name = name;
this.people = new ArrayList<>();
}
public void addPerson(Person person) {
people.add(person);
}
public void removePerson(Person person) {
people.remove(person);
}
@Override
public void displayDetails() {
System.out.println("Department: " + name);
for (Person person : people) {
person.displayDetails();
}
}
}
- 创建各种类型的叶子节点和组合节点,并进行组合成树形结构。然后调用顶层的展示方法来展示整个结构
// 4. 客户端代码
public class CompositePatternDemo {
public static void main(String[] args) {
// 创建叶子节点
Employee emp1 = new Employee("John");
Employee emp2 = new Employee("Alice");
Employee emp3 = new Employee("Bob");
// 创建组合节点
Department dept1 = new Department("Engineering");
dept1.addPerson(emp1);
dept1.addPerson(emp2);
Department dept2 = new Department("Marketing");
dept2.addPerson(emp3);
// 将部门组合成公司
Department company = new Department("Our Company");
company.addPerson(dept1);
company.addPerson(dept2);
// 展示整个公司结构
company.displayDetails();
}
}
组合模式通常用于表示具有层次结构的对象,例如文件系统、组织结构等,其中叶子节点和组合节点共享同一个接口。这种设计使得对待单个对象和组合对象的方式保持一致。