@XingdingCAO
2018-02-11T15:50:34.000000Z
字数 962
阅读 1732
design-pattern
OOD
Composite Pattern,也就是合成模式,是一种十分常见的模式。在学习awt
与swing
时早已接触到了,但当时并未意识到有着合成模式的存在。再后来,读到Design Pattern一书才开始对这一模式的了解。
该模式的设计初衷是:"Compose objects into tree structions to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly." 意思就是:合成模式将多个对象组织成为树形结构,以此来让客户端统一地对待单个对象和合成对象。
典型的应用场景为:文件系统。一个文件系统就是一个完整的树形结构,根结点为根文件夹,叶子结点为单个文件,其他结点为文件夹。
具体的实现方法则如下面的类图所示:
(图片源自《设计模式Java版》)
根据图示,结点抽象类Component
的声明既包含叶子结点的操作,也包含非叶子结点的合成管理操作。叶子结点类Leaf
选择性地实现了部分操作,而非叶子结点类Composite
实现了所有的接口声明的操作。
为了防止叶子结点类错误地调用管理操作,结点抽象类必须提供管理操作的默认实现,如:抛出异常来警示功能并未被执行。
使用方式如下:
Component file,file1,file2,folder;
file = new Leaf()
file1 = new Leaf()
file2 = new Leaf()
folder = new Composite()
folder.add(file);
folder.add(file1);
folder.add(file2);
但是此种方式有着一定的风险,如用户由于粗心或无知,错误地在叶子上调用了未实现管理操作,那么编译时无法检查出错误的方法调用,在运行时抛出异常。
file.add(file1) //error
由于这种合成模式,不论是否为叶子结点都可以用Component
类型定义,对于用户二者是透明的,所以称为透明组合模式。
此外,若想实现更为安全的组合模式,就得放弃透明性,这种组合模式称为安全组合模式
(图片源自《设计模式Java版》)