1、组合模式定义
将对象组合成树形结构以表示 ‘部分-整体’ 的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性
2、组合模式模型图
3、组合模式应用
- 表示对象的 ”部分-整体“ 的层次结构(树形结构)。例如:公司的组织架构图,总公司下面有区域办事处,区域办事处下面有各个省市的子公司;文件和文件夹的管理;树形菜单;
- 希望用户忽略组合对象和单个对象的不同,用户将统一的使用组合结构中的所有对象
4、代码案例
需要解决的问题:
这是公司的组织架构,用组合设计模式的思想,清晰的表达出整体的结构
抽象类 Company
public abstract class Company {
protected String name;
public Company(String name) {
this.name = name;
}
/**
* 增加
*/
abstract void add(Company company);
/**
* 移除
*/
abstract void remove(Company company);
/**
* 打印
*/
abstract void display(int depth);
}
代表公司的类 ConcreteCompany
public class ConcreteCompany extends Company {
private List<Company> childCompanys = new ArrayList<Company>();
public ConcreteCompany(String name) {
super(name);
}
void add(Company company) {
childCompanys.add(company);
}
void remove(Company company) {
childCompanys.remove(company);
}
void display(int depth) {
for (int i = 0; i < depth; i++) {
System.out.print("-");
}
System.out.println(name);
childCompanys.forEach(company -> company.display(depth + 2));
}
}
代表公司下的部分类 Department
public class Department extends Company {
public Department(String name) {
super(name);
}
@Override
void add(Company company) {
}
@Override
void remove(Company company) {
}
@Override
void display(int depth) {
for (int i = 0; i < depth; i++) {
System.out.print("-");
}
System.out.println(name);
}
}
测试客户端 CompanyClient
public class CompanyClient {
public static void main(String[] args) {
ConcreteCompany root = new ConcreteCompany("北京总公司");
root.add(new Department("总公司人力资源部"));
root.add(new Department("总公司人力财务部"));
ConcreteCompany huadong = new ConcreteCompany("上海华东分公司");
huadong.add(new Department("华东分公司人力资源部"));
huadong.add(new Department("华东分公司人力财务部"));
root.add(huadong);
ConcreteCompany nanjing = new ConcreteCompany("南京办事处");
nanjing.add(new Department("南京办事处人力资源部"));
nanjing.add(new Department("南京办事处人力财务部"));
huadong.add(nanjing);
ConcreteCompany suzhou = new ConcreteCompany("苏州办事处");
suzhou.add(new Department("苏州办事处人力资源部"));
suzhou.add(new Department("苏州办事处人力财务部"));
huadong.add(suzhou);
System.out.println("=======组织结构图=======");
root.display(1);
}
}
结果:
=======组织结构图=======
-北京总公司
---总公司人力资源部
---总公司人力财务部
---上海华东分公司
-----华东分公司人力资源部
-----华东分公司人力财务部
-----南京办事处
-------南京办事处人力资源部
-------南京办事处人力财务部
-----苏州办事处
-------苏州办事处人力资源部
-------苏州办事处人力财务部
5、组合模式总结
使用组合设计模式模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。