组合模式
- 一、介绍
- 二、人员管理系统使用案例
一、介绍
将对象组合成树形结构以表示“部分-整体”的层次关系。组合模式使得用户对单个对象和组合对象的使用都是相同的。
组合模式主要由以下几个部分构成:
- 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;}@Overridepublic 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);}@Overridepublic 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();}
}
组合模式通常用于表示具有层次结构的对象,例如文件系统、组织结构等,其中叶子节点和组合节点共享同一个接口。这种设计使得对待单个对象和组合对象的方式保持一致。