关于组合模式,大部分都是写的“部分——整体“的关系,部分组成了整体,把部分和整体可以看成一体。
可以把复杂的对象看做简单的对象。不过,再怎么说,我也觉得,这个模式还是没有深入的理解它的含义,印象不深刻。不过先说说我的认识。
在数据结构中,有树这种结构,尤其是特殊的二叉树,由此——产生了”组合模式“。组合模式=树形结构+递归。
看下组合模式的组成。
1) 抽象构件角色Component:它为组合中的对象声明接口,也可以为共有接口实现缺省行为。
2) 树叶构件角色Leaf:在组合中表示叶节点对象——没有子节点,实现抽象构件角色声明的接口。
3) 树枝构件角色Composite:在组合中表示分支节点对象——有子节点,实现抽象构件角色声明的接口;存储子部件。
如图所示:一个Composite实例可以像一个简单的Leaf实例一样,可以把它传递给任何使用Component的方法或者对象,并且它表现的就像是一个Leaf一样。
组合模式最常见的用处:1.树形菜单。2.操作系统的文件系统。
其实,就是看了那些例子也不太明白,为什么组合模式是这个样子?
慢慢回想,对比二叉树,才意识到了,有所不同。。。
以前写二叉树的只需要写一个节点类,而这个class需要定义节点的名字,以及固定的左孩子节点+右孩子节点,这样组合这些节点就能产生树。
而真正的菜单和文件系统,是不是也只有2个节点???肯定不是,既然不确定,当然没法直接定义一个通用的class,
那怎么办?
就是上面这种模式,component定义所有的方法,leaf就是最外层的叶子,没有下一级,而composite则是树枝,有下级。
那么我重新来说一下,正常的树木:
你可以把它抽象的看成,由树枝和树枝组成,最外层加上叶子。
比如说,冬天到了,叶子都落光了,是不是都是由树枝组成呢?
再拿,文件系统来说,文件+文件夹组成,而文件夹里面可以放文件,文件当然不能放文件夹。
把文件和文件夹,都看成最基本的一样东西,看成为一样的。因此,所有的文件+所有的文件夹=文件系统。
部分就组成了整体。
假如,你是一位大师,那你现在要设计一个菜单?那你该如何实现???是不是就应该学习这种方式。我的理解就是,原来这样。
这个代码就不贴了,都比较乱