组合模式
适用场景
把部分和整体的关系用树形结构来表示,从而使客户端可以使用统一的方式对部分对象和整体对象进行管理。
基本要素
- 抽象构件(Conponent)角色:所有类的共有接口,定义了叶子和容器的共同点。
- 叶子(Leaf)构件角色:在组合中表示叶子结点对象,叶子节点无子节点。
- 容器(Composite)构件角色:有容器特征,可以 用来存储子节点,在Component接口中实现与子节点有关操作,如增加(add)和删除 (remove)等。
使用示例
具体功能:输出当前部门及子部门的所有名称。
以学校为例,一个学校有多个学院,一个学院里有多个学科
抽象构件
/**
* @author wzc
* @description 抽象部门(学校,学院,学科)
* @date 2022/6/4 16:59
*/
public abstract class AbstractDept {
abstract void printName();
}
叶子构件
/**
* @author wzc
* @description 叶子节点,只有printName()业务方法。
* @date 2022/6/4 17:00
*/
public class LeafDept extends AbstractDept {
public String name;
public LeafDept(String name) {
this.name = name;
}
@Override
void printName() {
System.out.println(name);
}
}
容器构件
/**
* @author wzc
* @description 容器构件
* @date 2022/6/4 17:04
*/
public class CompositeDept extends AbstractDept {
public String name;
public List<AbstractDept> deptList = new ArrayList<>();
public CompositeDept(String name) {
this.name = name;
}
public void add(AbstractDept leafDept) {
deptList.add(leafDept);
}
public void remove(AbstractDept leafDept) {
deptList.remove(leafDept);
}
public AbstractDept getChild(int index) {
return deptList.get(index);
}
@Override
void printName() {
System.out.println("---- "+ name +" ----");
for (AbstractDept dept : deptList) {
dept.printName();
}
}
}
演示
/**
* @author wzc
* @description
* @date 2022/6/4 17:10
*/
public class Client {
public static void main(String[] args) {
CompositeDept school = new CompositeDept("清华大学");
CompositeDept dept1 = new CompositeDept("计算机学院");
CompositeDept dept2 = new CompositeDept("信息工程学院");
AbstractDept dept1_leaf1 = new LeafDept("软件工程");
AbstractDept dept1_leaf2 = new LeafDept("网络工程");
AbstractDept dept2_leaf1 = new LeafDept("通信工程");
AbstractDept dept2_leaf2 = new LeafDept("信息工程");
school.add(dept1);
school.add(dept2);
dept1.add(dept1_leaf1);
dept1.add(dept1_leaf2);
dept2.add(dept2_leaf1);
dept2.add(dept2_leaf2);
dept1.printName(); // 输出结果1
school.printName(); // 输出结果2
}
}
输出结果1:
---- 计算机学院 ----
软件工程
网络工程
输出结果2:
---- 清华大学 ----
---- 计算机学院 ----
软件工程
网络工程
---- 信息工程学院 ----
通信工程
信息工程