天天看点

Composite(组合)--对象结构型模式

Composite(组合)–对象结构型模式

一、意图

将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。

二、动机

1.软件在某些情况下,客户代码过多的依赖于对象容器复杂的内部实现结构,对象容器内部实现结构(而非抽象接口)的变化将引起客户代码的频繁变化,带来了代码的维护性、扩展性等弊端。

2.如何将“客户代码与复杂代码的对象容器结构”解耦?让对象容器自己来实现自身的复杂结构,从而使得客户代码就像处理简单对象一样来处理复杂的对象容器?

三、适用性

1.你想表示对象的部分-整体层次结构。

2.你希望用户忽略组合对象与耽搁对象的不同,用户将统一地使用组合结构中所有对象。

四、结构

Composite(组合)--对象结构型模式

五、效果

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模式就像一颗树。

本文为李建忠设计模式视频的笔记以及《设计模式-可复用面向对象的软件的基础》和自己的部分见解

继续阅读