Composite(组合)–对象结构型模式
一、意图
将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。
二、动机
1.软件在某些情况下,客户代码过多的依赖于对象容器复杂的内部实现结构,对象容器内部实现结构(而非抽象接口)的变化将引起客户代码的频繁变化,带来了代码的维护性、扩展性等弊端。
2.如何将“客户代码与复杂代码的对象容器结构”解耦?让对象容器自己来实现自身的复杂结构,从而使得客户代码就像处理简单对象一样来处理复杂的对象容器?
三、适用性
1.你想表示对象的部分-整体层次结构。
2.你希望用户忽略组合对象与耽搁对象的不同,用户将统一地使用组合结构中所有对象。
四、结构
五、效果
1.定义了保护洁白对象和组合对象的类层次结构。
2.简化客户代码。
2.是的更容易增加新类型的组件。
4.使你的设计变得更加一般化。
六、实现
1.显示的父部件引用。
2.共享组件。
3.最大化Component接口。
4.声明管理子部件的操作。
5.Component是否应该实现一个Component列表。
6.子部件排序。
7.使用高速缓冲存贮改善性能。
8. 应该由谁删除Component
9. 存贮组件最好用哪一个数据结构。
七、要点总结
1.Composite模式采用树形结构来实现普遍存在的对象容器,从而将“一对多”的关系转化为“一对一”的关系,使得客户代码可以一致地(复用)处理对象和对象容器,无需关系处理的是单个对象,还是组合的对象容器。
2.将“客户代码与复杂的对象容器结构”解耦是Composite的核心思想,解耦之后,客户代码将与纯粹的抽象接口——而非对象容器的内部实现结构——发生依赖,从而更能“应对变化”。
3.Composite模式在具体实现中,可以让父对象的子对反向追溯;如果父对象有频繁的遍历需求,可以使用缓存技巧来改善效率。
八、相关模式
通常部件-父部件连接用于Responsibility of Chain模式
Decorator模式经常与Composite模式一起使用。当装饰和组合一起使用时,它们通常有一个公共的父类。因此装饰必须支持Add、Remove和GetChild操作的Component接口。
Flyweight让你共享组件,但不再能引用它们的父部件。
Itertor可用来遍历Composite。
Visitor将本来应该分布子啊Composite和Leaf类中的操作和行为局部化。
九、举例说明
Composite模式就像一颗树。
本文为李建忠设计模式视频的笔记以及《设计模式-可复用面向对象的软件的基础》和自己的部分见解