Compose objects into tree structure to represent part-whole hierarchies.Composite lets clients treat individual objects and compositions of objects uniformly.(将对象组合成树形结构以表示部分-整体
的层次结构,使得用户对单个对象和组合的使用具有一致性。)
组合模式介绍
通用类图如下所示:
用户使用Component类接口与组合结构中的对象进行交互。如果接收者是一个叶节点,则直接处理请求,如果接收者是Composite,它通常将请求发送给它的子部件,在转发请求之前与/或之后可能执行一些辅助操作。
组合模式分析
优点:
- 定义了包含基本对象和组合对象的类的层次结构。基本对象可以被组合成更复杂的组合对象,这个组合又会被组合,不断递归下去。
- 简化客户代码。客户可以一致的使用组合结构和单个对象。
- 使得更容易增加新增类型的组件。
缺点:
- 很难限制组合中的组件。有时希望一个组合只能有某些特定组件。使用Composite时,不能依赖类型系统施加这些约束,而必须要在运行时刻进行检查。
组合模式实现
Golang
Java
首先是抽象的Component类:
public abstract class Component{
//部分与整体共享的方法
public void doSth(){
}
}
接下来是继承自树枝的类的实现,里面包含增加、删除以及获得分支下所有的叶子或分支组件的方法,代码如下:
public class Composite extends Component{
//Component容器
private ArrayList<Component> compList = new ArrayList<>();
//增加叶子/树枝节点
public void add (Component component){
this.compList.add(component);
}
//删除叶子/树枝节点
public void remove(Component component){
this.compList.remove(component);
}
//获得分支下所有的叶子/分支Component
public ArrayList<Component> getChildren(){
return this.compList;
}
}
叶子节点的实现方法:
public class Leaf extends Component{
}
组合模式就这么简单的实现了。为表诚意,我再实现个场景类来说明如何调用这些个方法:
public class Client{
public static void main(String[] args) {
//创建根节点
Composite root = new Composite();
root.doSth();
//创建一个树枝
Composite branch = new Composite();
//创造叶子
Leaf leaf = new Leaf();
//组合
root.add(branch);
branch.add(leaf);
}
}
此类中,显示创建根节点,然后是树枝,最后是叶子,然后这些被组合成树。就此结束。
组合模式之应用场景
- 表示整体-部分的层次结构。
- 希望用户忽略组合对象与单个对象的不同,用户将统一的使用组合结构中的所有对象。