组合模式——java设计模式(十)
简介
组合模式(Composite Pattern):组合多个对象形成树形结构,以表示具有整体部分关系的层次结构,使客户端可以统一的对待单个对象和组合对象。
- 需要客户端一致的处理叶子构件和容器构件,可以定义抽象构件,代表叶子构件和容器构件,并在容器构件中关联抽象构件,形成树形结构。
- 组合模式又称部分-整体模式。
结构和实现
- 角色包括:
- 抽象构件:叶子构件和容器构件继承的抽象类,包含叶子和容器的共有行为的声明,如业务方法,也可能包含管理叶子的方法。
- 叶子构件:树的叶结点,实现抽象构件的业务方法,对于容器特有的管理子结点的方法,可以使用空方法或者抛出异常处理。
- 容器构件:树的非叶结点,管理包含的子结点,业务方法可以递归调用子结点的业务方法。
- 根据透明性和安全性,组合模式分为透明组合模式和安全组合模式。
透明组合模式
- 抽象构件声明了管理叶结点的方法和业务方法,客户端可以一致对待所有对象。但是叶结点不可能管理子结点,如果管理方法处理不好会出错。
安全组合模式
- 抽象构件中只声明了业务方法,叶结点没有管理子结点的方法,是安全的。但是叶子构件和容器构件不一致,客户端需要区别对待。
实例
- 开发杀毒软件,既可以对文件夹杀毒,也可以对指定文件杀毒。
优缺点和适用环境
- 优点:
- 清楚的定义树形的复杂对象。
- 忽略层次差异。客户端可以不关心是组合结构和是单个对象,对整个层次控制。
- 方便增加构件。无论容器构件和是叶子构架,增加无需修改源码,符合开闭原则。
- 缺点:
- 难以对容器中的构件类型限制。无法限定某个容器中只包含容器构件等,需要运行时类型检查。
- 适用环境:
- 客户端需要忽略整体和部分的差异。
- 需要处理树形结构。
- 系统中可以分离容器和叶子对象,且类型不确定。
jdk中的应用
- org.w3c.dom中的Node,可形成树形结构。