组合模式(Composite Pattern)是一种结构型设计模式, 将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。

abstract class Node {
public Node(String name) {
this.name = name;
}
//节点名称
String name;
//添加节点
abstract Node add(Node node);
//输出节点
abstract void print();
}
class RootNode extends Node {
//子节点
List<Node> list = new ArrayList<>();
public RootNode(String name) {
super(name);
}
//添加子节点
@Override
Node add(Node node) {
this.list.add(node);
return this;
}
//输出
@Override
void print() {
System.out.println(name);
this.list.forEach(Node::print);
}
}
class LeafNode extends Node {
public LeafNode(String name) {
super(name);
}
//叶子节点为最后一个节点,不能添加子节点
@Override
Node add(Node node) {
throw new UnsupportedOperationException();
}
//输出
@Override
void print() {
System.out.println(" "+name);
}
}
通过RootNode LeafNode 构建节点树。
new RootNode("中国")
.add(new RootNode("北京")
.add(new LeafNode("朝阳区"))
.add(new LeafNode("海淀区")
))
.add(new RootNode("山东")
.add(new LeafNode("济南"))
.add(new LeafNode("青岛")
)).print();
优点:
缺点:
设计抽象,功能差异化非常大的接口包装困难。
组合模式用于将多个对象组合成树形结构以表示“整体-部分”的结构层次,组合模式对单个对象(叶子对象)和组合对象(容器对象)的使用具有一致性。
简单来说,需要实现树状结构(整体-部分),适合使用组合模式,反之不适合(不代表不能用,需要特殊适配,得不偿失)。