定义
组合多个对象形成树形结构以表示有整体-部分关系层次结构,组合模式可以让客户端统一对待单个对象和组合对象
应用场景
存在父子层级关系,父子可用同一个对象表示。
组合模式正是应树形结构而生,所以组合模式的使用场景就是出现树形结构的地方。比如:文件目录显示,多及目录呈现等树形结构数据的操作。
组合模式的结构
- 抽象构件(Component)角色:它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为。在透明式的组合模式中抽象构件还声明访问和管理子类的接口;在安全式的组合模式中不声明访问和管理子类的接口,管理工作由树枝构件完成。
- 树叶构件(Leaf)角色:是组合中的叶节点对象,它没有子节点,用于实现抽象构件角色中 声明的公共接口。
- 树枝构件(Composite)角色:是组合中的分支节点对象,它有子节点。它实现了抽象构件角色中声明的接口,它的主要作用是存储和管理子部件,通常包含 Add()、Remove()、GetChild() 等方法。
代码示例
员工employee分为程序员coder和领导leader
public interface Employee {
void add(Employee employee);
void remove(Employee employee);
void zuyuan();
}
public class Coder implements Employee {
private String name;
public Coder(String name) {
this.name = name;
}
@Override
public void add(Employee employee) {
}
@Override
public void remove(Employee employee) {
}
@Override
public void zuyuan() {
System.out.println(name);
}
}
public class Leader implements Employee {
private String name;
private List<Employee> employees = new ArrayList<Employee>();
public Leader(String name) {
this.name = name;
}
@Override
public void add(Employee employee) {
employees.add(employee);
}
@Override
public void remove(Employee employee) {
employees.remove(employee);
}
@Override
public void zuyuan() {
System.out.println(name + "组里有");
employees.forEach(a -> {
a.zuyuan();
});
}
}
public class BuildTree {
public static void main(String[] args) {
Employee ceo = new Leader("CEO");
Employee leader1 = new Leader("leader1");
Employee leader2 = new Leader("leader2");
Employee coder1 = new Coder("coder1");
Employee coder2 = new Coder("coder2");
Employee coder3 = new Coder("coder3");
ceo.add(leader1);
ceo.add(leader2);
leader1.add(coder1);
leader1.add(coder2);
leader2.add(coder3);
ceo.zuyuan();
}
}
结果输出
CEO组里有
leader1组里有
coder1
coder2
leader2组里有
coder3