将对象组合成树形结构以表示‘部分-整体’的曾侧结构。并利用多态性使单个对象和组合对象的使用具有一致性。
概述
- 通过对命令的封装,可一键对各种命令进行执行,不用关心各命令的执行过程,并依次向下传递
- 用户只需关心最顶层的组合对象即可
- 可以一致的对待组合对象和基本对象
简例
|
|
可见,我们的组合命令可以任意的向下扩展,仅仅关心执行即可。
透明性带来的安全问题
- 组合对象都带有add方法而叶节点没有
- 通过给叶节点添加同样的方法并抛出异常来解决
注意
1.组合模式不是父子关系
组合对象是一种聚合关系,叶节点并不是组合对象的子类,只是具有相同的接口
2.针对叶节点操作的一致性
针对一系列叶节点,需要有一致性操作,假设有特殊情况,就不太方便了。
3.双向映射关系
对于某种情况,假设是给员工发邮件,假设员工隶属多个组,会重复收到。这种结构是不合适的,往往需要建立双向映射关系。
我们可以通过中介者模式来管理这些对象。
4.用职责链模式提高组合模式性能
借用职责模式避免遍历整棵树
引用父对象
有的时候还是需要保持父级组合对象的引用,来进行更多的操作,可以通过这种方式实现
|
|
总结
组合模式可以大大简化用户代码,适用于以下两种情况:
- 表示对象的部分-整体结构,进行统一操作。在组合模式中添加和删除节点非常方便。
- 客户需要统一对待树中所有的对象,用户不用关心正在处理的是组合对象还是叶对象。