意图
将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。
例子
组合很好的例子就是画图的时候,图中有图,有文字,有线条等。
基础接口public interface Graphic {
public void draw();
public void add(Graphic graphic);
public void remove(Graphic graphic);
public void getChild(int child);
}
看看普通leaf组建public class Text implements Graphic {
public void draw() {
System.out.println("文本")
}
public void add(Graphic graphic) {}
public void remove(Graphic graphic) {}
public void getChild(int child) {}
}
他并不具备子部件功能
看看Composite组建public class Picture implements Graphic {
public void draw() {
for(Graphic g : list)
g.draw();
}
public void add(Graphic graphic) {
list.add(graphic);
}
public void remove(Graphic graphic) {
list.remove(graphic);
}
public void getChild(int child) {
...
}
}
适用性
- 想表示对象的部分-整体层次结构
- 希望用户忽略组合对象与单个对象的不同,用户将统一的使用组合结构中的所有对象
结构
典型的 Composite 对象结构如下图所示。
协作
用户使用Component类接口与组合结构中的对象进行交互。如果接收者是一个叶节点,则直接处理请求。如果接收者是Composite, 它通常将请求发送给它的子部件,在转发请求之前与/或之后可能执行一些辅助操作。
效果
• 定义了包含基本对象和组合对象的类层次结构 基本对象可以被组合成更复杂的组合对
象,而这个组合对象又可以被组合,这样不断的递归下去。客户代码中,任何用到基本
对象的地方都可以使用组合对象。
• 简化客户代码 客户可以一致地使用组合结构和单个对象。通常用户不知道 (也不关心)
处理的是一个叶节点还是一个组合组件。这就简化了客户代码 , 因为在定义组合的那些
类中不需要写一些充斥着选择语句的函数。
• 使 得 更 容 易 增 加 新 类 型 的 组 件 新定义的 Composite 或 Leaf 子 类 自 动 地 与 已 有 的 结 构 和 客
户代码一起工作,客户程序不需因新的 Component类而改变。
• 使你的设计变得更加一般化 容易增加新组件也会产生一些问题,那就是很难限制组合
中的组件。有时你希望一个组合只能有某些特定的组件。使用 Composite 时,你不能依
赖类型系统施加这些约束,而必须在运行时刻进行检查。