组合模式(Composite Pattern)

1、概述
组合模式是一种树形结构,每个节点可以看作一个对象,在一个对象中又包含其他对象,这些被包含的对象可能是终点对象(叶子结点),也有可能是非终点对象(也叫组对象或者非叶子结点)。
组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,组合模式又可以称为“整体—部分”(Part-Whole)模式,它是一种对象结构型模式。
在组合模式结构图中包含如下几个角色:
  • Component(抽象构件):它可以是接口抽象类,为叶子构件和容器构件对象声明接口,在该角色中可以包含所有子类共有行为的声明和实现。在抽象构件中定义了访问及管理它的子构件的方法,如增加子构件、删除子构件、获取子构件等。
  • Leaf(叶子构件):它在组合结构中表示叶子节点对象,叶子节点没有子节点,它实现了在抽象构件中定义的行为。对于那些访问及管理子构件的方法,可以通过异常等方式进行处理。
  • Composite(容器构件):它在组合结构中表示容器节点对象,容器节点包含子节点,其子节点可以是叶子节点,也可以是容器节点,它提供一个集合用于存储子节点,实现了在抽象构件中定义的行为,包括那些访问及管理子构件的方法,在其业务方法中可以递归调用其子节点的业务方法。
2、优缺点
优点: 1、高层模块调用简单。 2、节点自由增加。
缺点:在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。
3、场景
场景:部分、整体场景,如树形菜单,文件、文件夹的管理。
4、实例
组合模式(Composite Pattern)
public class Noder {
private String name;
public Noder(String name) {
this.name = name;
}
List<Noder> noderList = new ArrayList<Noder>();
public void add(Noder noder) {
noderList.add(noder);
}
public void remove(Noder noder) {
noderList.remove(noder);
}
public List<Noder> getNoderList() {
return noderList;
}
@Override
public String toString() {
return "Noder{" +
"name='" + name + '\'' +
", noderList=" + noderList +
'}';
}
}

public class CompositePatternDemo {
public static void main(String[] args) {
Noder noder = new Noder("顶级文件夹");
Noder noderLeft = new Noder("左文件夹");
Noder noderRight = new Noder("右文件夹");
noder.add(noderLeft);
noder.add(noderRight);

Noder leaf1 = new Noder("叶子节点1");
Noder leaf2 = new Noder("叶子节点2");
noderLeft.add(leaf1);
noderRight.add(leaf2);

List<Noder> noderList = noder.getNoderList();
for(Noder temp: noderList) {
System.out.println(temp.toString());;
}
}
}

增加节点:左文件夹
增加节点:右文件夹
增加节点:叶子节点1
增加节点:叶子节点2
Noder{name='左文件夹', noderList=[Noder{name='叶子节点1', noderList=[]}]}
Noder{name='右文件夹', noderList=[Noder{name='叶子节点2', noderList=[]}]}