1、模式介绍:
组合模式是一种结构型设计模式,它允许你将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
2、应用场景:
表示树形结构:当你需要表示对象的部分-整体层次结构时,例如文件系统中的文件和目录,图形界面中的 UI 组件,公司组织结构中的部门与员工等。
统一处理:希望客户端能够统一处理单个对象和组合对象时,可以使用组合模式。这样客户端不需要关心处理的是单个对象还是组合对象。
3、优点:
简化客户端代码:客户端可以一致地对待单个对象和组合对象,无需区分它们的具体类型。
灵活性:可以在运行时动态地增加或移除子对象,更容易扩展。
层次结构:可以更好地表示对象的层次结构,方便递归遍历和操作。
4、缺点:
限制类型:可能限制组合中的组件类型,因为组件必须实现统一的接口或继承自统一的类。
复杂性:可能会使设计更加抽象复杂,特别是在处理深层次的递归结构时。
5、代码实现:
/**
* 抽象组件接口
*
* @author FM_南风
* @date 2024/7/3
*/
public interface Department {
void printDepartmentName();
}
/**
* 子节点:具体部门
*
* @author FM_南风
* @date 2024/7/3 13:55
*/
public class ConcreteDepartment implements Department{
private String name;
public ConcreteDepartment(String name) {
this.name = name;
}
@Override
public void printDepartmentName() {
System.out.println("Department: " + name);
}
}
/**
* 子节点:组合部门
*
* @author FM_南风
* @date 2024/7/3
*/
public class CompositeDepartment implements Department{
private String name;
private List<Department> departments = new ArrayList<>();
public CompositeDepartment(String name) {
this.name = name;
}
public void addDepartment(Department department) {
departments.add(department);
}
public void removeDepartment(Department department) {
departments.remove(department);
}
@Override
public void printDepartmentName() {
System.out.println("Department: " + name);
for (Department department : departments) {
department.printDepartmentName();
}
}
}
/**
* 应用
*
* @author FM_南风
* @date 2024/7/3
*/
public class CompositeClient {
public static void main(String[] args) {
ConcreteDepartment salesDepartment = new ConcreteDepartment("A");
ConcreteDepartment marketingDepartment = new ConcreteDepartment("B");
CompositeDepartment headDepartment = new CompositeDepartment("C");
headDepartment.addDepartment(salesDepartment);
headDepartment.addDepartment(marketingDepartment);
ConcreteDepartment financeDepartment = new ConcreteDepartment("D");
headDepartment.addDepartment(financeDepartment);
headDepartment.printDepartmentName();
}
}
6、结果展示:
示例说明:
在上面的示例中,Department
是抽象组件类,定义了统一的接口 printDepartmentName()
。ConcreteDepartment
是叶子节点类,表示具体的部门。CompositeDepartment
是容器节点类,表示组合的部门,可以包含其他部门(包括叶子部门和容器部门)。客户端通过操作抽象组件 Department
来构建和操作部门与员工的层次结构。