简介
又称部分整体模式,将对象组合成树形结构以表示'部分-整体'的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性
UML图:
应用场景
- 银行总行-分行
- 总公司-分公司
- 文件夹-文件
- 要处理的对象可以生成一颗树形结构,对树上的节点和叶子进行操作时,能够提供一致的方式
示例
总公司、分公司、部门关系
- 根结点:总公司
java
public abstract class Company {
protected String name;
public Company(String name) {
this.name = name;
}
/**
* 添加公司
*
* @param company
*/
public abstract void add(Company company);
/**
* 删除公司
*
* @param company
*/
public abstract void remove(Company company);
/**
* 展示公司
*
* @param depth
*/
public abstract void display(int depth);
}
- 节点:分公司,具有总公司的所有属性
java
public class ConcretCompany extends Company {
List<Company> companies = new ArrayList<>();
public ConcretCompany(String name) {
super(name);
}
@Override
public void add(Company company) {
companies.add(company);
}
@Override
public void remove(Company company) {
companies.remove(company);
}
@Override
public void display(int depth) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < depth; i++) {
sb.append("-");
}
System.out.println(sb + this.name);
for (Company company : companies) {
// 分级
company.display(depth + 2);
}
}
}
- 叶子节点:部门
java
public class Department extends Company {
public Department(String name) {
super(name);
}
@Override
public void add(Company company) {
}
@Override
public void remove(Company company) {
}
@Override
public void display(int depth) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < depth; i++) {
sb.append("-");
}
System.out.println(sb + this.name);
}
}
- 运行
java
public class Main {
public static void main(String[] args) {
Company company = new ConcretCompany("总公司");
Company department01 = new Department("人事部门");
Company department02 = new Department("数字部门");
company.add(department01);
company.add(department02);
Company company1 = new ConcretCompany("分公司01");
Company department03 = new Department("分公司01的数字部门");
company1.add(department03);
Company company2 = new ConcretCompany("分公司02");
Company department04 = new Department("分公司02的数字部门");
company2.add(department04);
company.add(company1);
company.add(company2);
// 总公司架构
company.display(0);
}
}
总结
- 优点
- 客户端只需要面对一致的对象无需考虑整体部分的问题
- 方便创建复杂的层次结构
- 缺点
- 客户端需耗费较多时间梳理类之间的层次关系