什么是组合模式
组合模式(Composite Pattern)是一种结构型设计模式, 将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
组合模式的实现
模式结构
- 组件(Component)角色
抽象节点的共有属性及定义统一操作处理。 - 叶子节点(Leaf)角色
单个节点, 它不包含子节点。 - 容器(Composite)
包含叶节点或其他容器等组件。
抽象节点类
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();
组合模式的使用场景
- 客户端忽略部分组件差异,统一入口实现 。
- 表现为树状(整体-部分)结构。
例如:文件系统、组织结构、决策树等场景。
组合模式的优缺点
优点:
- 符合开闭原则,可扩展,节点灵活配置。
- 能够非常好地处理层次结构,简化客户端调用。
缺点:
设计抽象,功能差异化非常大的接口包装困难。
总结
组合模式用于将多个对象组合成树形结构以表示“整体-部分”的结构层次,组合模式对单个对象(叶子对象)和组合对象(容器对象)的使用具有一致性。
简单来说,需要实现树状结构(整体-部分),适合使用组合模式,反之不适合(不代表不能用,需要特殊适配,得不偿失)。