Composite

来源:互联网 发布:红尘网络 编辑:程序博客网 时间:2024/05/12 03:37
使用场景
需要表示对象的部分-整体层级结构
想要客户能够忽略对象组合和单个对象之前的差异。客户端同等对待所有的对象。
结构

参与对象
组件
  • 为所有的对象声明接口
  • 为所有的类实现默认的行为
  • 为访问和管理它的子组件声明接口
  • (可选)为访问父组件声明接口
叶子节点
  • 在组合结构中代表叶子对象,没有子对象
  • 定义组合结构中的原始操作
复合节点
  • 为拥有子节点的组件定义操作
  • 存储子节点
  • 实现组合系统中子节点相关的操作
客户端
  • 通过组件接口操纵系统中的所有对象
协作方式
客户端通过组件接口来和组合系统中的对象进行交互。如果被操作对象是叶子节点,请求直接被处理。如果被操作对象时组合对象,它会把请求分发给它的子节点,然后在分发前后执行相关的操作。
使用结果
定义一套包含原始对象和组合对象的类层级结构。原始对象能够聚合称为复杂的对象,以此进行递归操作。
使得客户端变得简单。客户能够统一对待组合对象和单个对象。客户通常不知道他们在处理的是单个对象还是组合对象,这样能简化客户端代码,避免使用很多case代码。
使添加新的组件种类变得更容易。新定义的组件或者叶子节点能够在系统中正常工作,而客户端不需要额外的操作。
使设计更加普遍。添加新类型的节点边的容易的代价是,使得限制组合对象的组件变得更加困难。有时,你会需要一个只包含某种组件的复合对象,这时,你就不能依赖类型系统来保证这种完整性了,你需要做运行的检测。
0 0