阿Sam的设计模式学习笔记---- Composite模式

来源:互联网 发布:js 获取静态json文件 编辑:程序博客网 时间:2024/06/07 01:40
1,  功能
    将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。
    Composite模式主要用于描述和解决一些具有“容器”特征的对象它们又是对象,又是其他对象的容器。如果客户代码过多地依赖对象容器的内部实现,对象容器内部实现的变化会引起客户代码的变化,违反了设计原则中的DIP原则(高层模块不应依赖于低层模块,二者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象)
2,  基本思想
    当我们看到“部分-整体”的概念时,就应该想到树结构,一棵树有根(整体),有枝(父部件的部分,子部件的整体---有点绕口啊!!),有叶(部分)。
    为了保证部分-整体结构中,用户对单个对象和组合对象操作一致性,Composite就必须既能提供单个对象的操作,又要提供对象组合的管理。
    因此,需要一个Component,为组合中的对象声明公有接口(适当情况中提供公有接口的缺省行为),这个Component还需要声明几个接口方法用于访问和管理子组件。如果需要递归访问,可以定义一个接口用于访问父节点。一棵树上所有节点都实现Component接口。
    继承并实现ComponentComposite就是根节点或中间节点。Composite首先是一个“容器”,它要管理它的组合对象,因此要定义管理对象组合的接口方法。同时Composite又是其“父部件”的子部件,它也要实现子部件的公有接口操作。
    Leaf是“部分-整体”结构中最基础的对象。Leaf是叶节点,没有子节点,因此它没有子节点要管理。所以,Leaf中只需要实现公有接口的方法。
    由若干CompositeLeaf组成了一个类似树的结构。可以参看下面的结构图。
Client对组合部件的操作是通过调用Component接口来完成。
3,  适用情况
表示对象的部分-整体层次结构
希望用户忽略组合对象与单个对象的不同,用户可以统一使用组合结构中的所有对象。
4,  结构
 
5,  总结
    在开发过程中,当我们遇到“部分--整体”的对象结构时,我们就需要考虑是否可以用Composite模式。Composite模式具有下列优点:
    Composite使客户端调用简单,客户端可以一致的使用组合结构或其中单个对象,用户不必关心自己处理的是单个对象还是整个组合结构。
    更容易在组合体内加入对象部件,客户端不必因为加入了新对象部件而更改代码。
6,  相关模式
    通常部件-父部件连接用于Responsibility of Chain模式
    Decorator模式经常与Composite模式一起使用。当装饰和组合一起使用时,他们通常有一个公共的父类。
    FlyWeight可以共享组件,但不能再引用他们的父部件。
    Iterator可以用来遍历Composite.
    Vistor将本来应该分布在CompositeLeaf类中的操作和行为局部化。
 
原创粉丝点击