C++设计模式之Composite(组合)模式

/ 0评 / 0

Published by orzz.org(). (http://orzz.org/cpp_composite/)

组合模式是一个很有意思的模式。

它的特征在于自身和自身的组合 —— 我们可以先想象有这么一个对象,它是一个集合(可以是数组或链表或其他的容器),它内部的子对象和它是同一个类型的对象。

恩,想象到这里就够了,这就是一个组合模式的感觉。这样想的话,组合模式似乎有点像一棵多叉树,每个结点下面都可以任意组合多个子节点,类图似乎也应该像一棵树的感觉。
不过由于组合模式的重点在于自身和自身的组合,所以类图其实并不复杂:


蓝色的IFunction,表示一个我们需要的操作;
绿色的IComponent,是组合接口,它封装了为了支持“组合”这个功能而必须的一组方法:“Add”和“Remove”。当然,方法名称不是固定的,只要能够表达这两个语义即可。同时,它需要从IFunction继承,这样所有的组合对象都必须实现我们需要的操作。
组合对象可以有两种,一种是可以添加别的对象的CComposite;另一种则是只能被其他对象组合,而自身无法再继续添加新对象的CLeaf(其实就是只能当树叶的结点,有点像final?)。

严格来说,CLeaf可以算作是“阉割版”的CComposite,如果没有Operation(操作)上的区别,它完全可以从CComposite继承,然后把“Add”和“Remove”方法private(私有化)掉。
当然了,如果不需要“叶子”结点的话,在实际项目中完全可以不写这么一个东西。设计模式本身是非常灵活的,它里面的每一个对象都代表了一种逻辑上的封装或抽象。在实际使用的时候,不需要的抽象自然不需要去实现它,关键在于理解和运用这些抽象。

这里的示例实现和上文中的类图有部分不一致的地方。比如说IComponent接口增加了一个Display方法,用来显示在当前深度下的IComponent。之所以增加这个方法,主要是为了在控制台下打印出组合模式组合完成后的树的形状。

下面给出完整的代码示例:

代码运行结果如下:

组合模式可以把所有具有类似功能的对象组合成树状结构,在所有“部分和整体具有相似性”的情况下,都可以斟酌使用。
比如界面开发里,窗口-控件之间的关系(父子关系);资源管理器的树状目录列表等。

Published by orzz.org(). (http://orzz.org/cpp_composite/)

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据