大战设计模式13—— 组合模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大战设计模式13—— 组合模式相关的知识,希望对你有一定的参考价值。

组合模式(Composite)

 

设计模式使用的例子https://github.com/LinkinStars/DesignPatternsAllExample

 

一、定义

组合多个对象形成树形结构以表示具有“整体-部分”关系的层次结构。

组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性.

组合模式又可以称为“部分-整体”(Part-Whole)模式,它是一种对象结构型模式。 

 

二、结构

Component(抽象构件):它是接口或抽象类,为叶子构件和容器构件对象声明接口,在该角色中可以包含所有子类共有行为的声明和实现。

在抽象构件中定义了访问及管理它的子构件的方法,例如增加子构件、删除子构件、获取子构件等。

Leaf(叶子构件):它在组合模式中表示叶子结点对象,叶子结点没有子节点,它实现了在抽象构件中定义的行为。

Composite(容器构件):它在组合模式中表示容器节点对象,容器节点包含子节点,其子节点可以使叶子结点,也可以是容器节点,它提供一个集合用于存储子节点,实现了在抽象构件中定义的行为。

 

三、优点

可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,使客户忽略了层次的差异,方便对整个层次结构进行控制。

增加新的容器构件和叶子构件都十分方便,无需对现有类库代码进行任何修改,符合开闭原则。

为树形结构的面向对象实现提供了灵活地解决方案,可以形成复杂的树形结构,但对树形结构的控制却很简单。

 

四、缺点

增加新构件时很难对容器中的构建类型进行限制。

 

五、应用场景

在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,客户端可以一致地对待他们。

在一个使用面向对象语言开发的系统中需要处理一个树形结构。

 

六、个人总结

1、如果你对数据结构中的树形结构比较了解,更进一步说你可能知道各种二叉树以及遍历方式,那么这个设计模式就是这个数据结构的一个实现。

2、组合模式简单的说,就是将几个不同的需要被操作的对象,组合在一起,这样就不需要分别进行操作,一起操作就可以了。

3、这个模式常常与迭代器模式相讨论,因为迭代器模式最后产生的对象我们需要进行遍历的时候我们还是需要一个个分别操作

而组合模式正好解决了这个问题,例子中也是在迭代器模式的基础上进行了改进,在实际中不会如此复杂,但思想应该是一样的。

4、这个模式是树形数据结构的实现,所以有很多变种,你可以根据自己的需要对节点进行调整即可。

例子中没有使用叶子构建,因为我这里为了方便就直接使用容器构件作为最后的节点。

组合模式的增加,删除等操作都是可以被设计的,例子中仅仅实现遍历的方法。

而且遍历的方式也有不同的顺序,这里就不多做说明了,这里主要用的是树的遍历次序,参考数据结构的支持即可。

 

 

参考博客:http://www.cnblogs.com/edisonchou/p/7082904.html

以上是关于大战设计模式13—— 组合模式的主要内容,如果未能解决你的问题,请参考以下文章

GO设计模式13组合模式

模式解密(13)- 组合模式

初学设计模式之组合模式

大战设计模式—— 工厂模式

大战设计模式16—— 桥接模式

大战设计模式23—— 原型模式