组合模式(Composite Pattern)
定义
允许将对象组合成树形结构来表现“整体-部分”层次结构。组合让客户以一致的方式处理个别对象和对象组合。
意义
- 组合模式能让我们用树形方式创建对象的结构,树里面包含组合以及个别对象
- 使用组合结构我们能把相同的操作应用在组合和个别对象上,即在大多数情况下,我们可以忽略组合和个别对象之间的差别
类图
所有的组件都必须实现Component接口,然而,叶节点和组合结点的角色不同,所以有些方法对于叶节点来说可能并没有意义,我们可以抛出运行时异常(UnsupportedOperationException)
例子
- 结构图
- Component
public abstract class Employer {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public abstract void add(Employer employer);
public abstract void delete(Employer employer);
public List employers;
public void printInfo() {
System.out.println(name);
}
public List getEmployers() {
return this.employers;
}
}
- Leaf
public class Programmer extends Employer {
public Programmer(String name) {
setName(name);
employers = null;//程序员, 表示没有下属了
}
public void add(Employer employer) {
}
public void delete(Employer employer) {
}
}
public class ProjectAssistant extends Employer {
public ProjectAssistant(String name) {
setName(name);
employers = null;//项目助理, 表示没有下属了
}
public void add(Employer employer) {
}
public void delete(Employer employer) {
}
}
- Composite
public class ProjectManager extends Employer {
public ProjectManager(String name) {
setName(name);
employers = new ArrayList();
}
public void add(Employer employer) {
employers.add(employer);
}
public void delete(Employer employer) {
employers.remove(employer);
}
}
- Client
public class Test {
public static void main(String[] args) {
Employer pm = new ProjectManager("项目经理");
Employer pa = new ProjectAssistant("项目助理");
Employer programmer1 = new Programmer("程序员一");
Employer programmer2 = new Programmer("程序员二");
pm.add(pa);//为项目经理添加项目助理
pm.add(programmer2);//为项目经理添加程序员
List ems = pm.getEmployers();
for (Employer em : ems) {
System.out.println(em.getName());
}
}
}
- result
项目助理
程序员二