[关闭]
@XingdingCAO 2018-02-11T15:50:34.000000Z 字数 962 阅读 1732

Composite模式

design-pattern OOD


Composite Pattern,也就是合成模式,是一种十分常见的模式。在学习awtswing时早已接触到了,但当时并未意识到有着合成模式的存在。再后来,读到Design Pattern一书才开始对这一模式的了解。

Composite Pattern

该模式的设计初衷是:"Compose objects into tree structions to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly." 意思就是:合成模式将多个对象组织成为树形结构,以此来让客户端统一地对待单个对象和合成对象。

典型的应用场景为:文件系统。一个文件系统就是一个完整的树形结构,根结点为根文件夹,叶子结点为单个文件,其他结点为文件夹。
fileSys

具体的实现方法则如下面的类图所示:
Composite
(图片源自《设计模式Java版》

根据图示,结点抽象类Component的声明既包含叶子结点的操作,也包含非叶子结点的合成管理操作。叶子结点类Leaf选择性地实现了部分操作,而非叶子结点类Composite实现了所有的接口声明的操作。
为了防止叶子结点类错误地调用管理操作,结点抽象类必须提供管理操作的默认实现,如:抛出异常来警示功能并未被执行。

使用方式如下:

  1. Component file,file1,file2,folder;
  2. file = new Leaf()
  3. file1 = new Leaf()
  4. file2 = new Leaf()
  5. folder = new Composite()
  6. folder.add(file);
  7. folder.add(file1);
  8. folder.add(file2);

但是此种方式有着一定的风险,如用户由于粗心或无知,错误地在叶子上调用了未实现管理操作,那么编译时无法检查出错误的方法调用,在运行时抛出异常。

  1. file.add(file1) //error

由于这种合成模式,不论是否为叶子结点都可以用Component类型定义,对于用户二者是透明的,所以称为透明组合模式

此外,若想实现更为安全的组合模式,就得放弃透明性,这种组合模式称为安全组合模式

safe
(图片源自《设计模式Java版》

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注