组合模式讲解

现在我们来看一下组合模式的定义与类型,定义是说将对象组合成树形结构,以表示部分整体的层次结构,

那他的作用是说使客户端对单个对象和组合对象保持一致的方式处理,类型是结构型

打个比方,我们有一个树形结构的菜单,然后在菜单里面还有子菜单,那在子菜单里面很有可能有子菜单的子菜单,

那在这种树形结构下,我们就可以使用组合模式,还有目录,目录下边还有目录,目录下边还有问题,那在这种情况下,

也可以使用组合模式,那我们看一下图

node节点是一个带子元素的节点,那没有子元素的节点叫叶子节点,就是图中的leaf节点,那组合模式,

让我们能够用树形的方式,创建对象的结构,那树里面包含了组合,以及个别的对象,那么我们把相同的操作,

应用到组合和个别的对象上,在大多数业务场景下呢,我们就可以忽略对象组合和个别对象之间的差别,

那我们再看一下

组合模式的应用场景,首先希望客户端可以忽略组合对象与单个对象的差异时,还有一个处理一个树形结构时,

也就是说如果我们使用组合模式呢,对个别对象以及组合对象,就可以一视同仁

那我们接着来看一下组合模式的优点,可以清楚地定义分层次的复杂对象,表示对象的全部或者部分层次,

强调的是让客户端忽略层次的差异,方便对整个层次结构进行控制,同时还会简化客户端的代码,那简化客户端的

代码是因为第二条,因为我们可以一致的处理组合对象和单个对象,所以我们在客户端代码上,处理起来就比较

简化了,还有呢符合开闭原则,我们在组合模式中,增加新的含有子节点的节点,还有增加叶子节点的时候,都很方便,

无须对现有的类库,进行任何修改,这一点上符合开闭原则,那我们再看一下组合模式有什么缺点呢

首先限制类型时会比较复杂,打个比方,例如说我们在某个文件夹中,只能包含文本文件,我们在使用组合模式时,

因为他们都来自相同的抽象层,也就是说节点的抽象层,那在这种情况下,我们必须通过在运行时,进行类型检查,

来实现,那在实现限制类型当中呢,自然就会变复杂,那第二条使设计变得更抽象,这个呢也很好理解,那如果我们的

对象业务逻辑,非常复杂,那在实现组合模式的时候,还是非常有挑战的,因为如果业务逻辑非常复杂的话,就会有一些特例,

不是所有的方法都有叶子节点关联,现在如果理解不了没有关系,我们在后面coding的时候,在慢慢体会,而且呢设计模式,

是非常值得我们回头不断来看的,每次学习都会增加新的体会,所以呢这需要一个过程,来慢慢理解,不要着急,我们一起慢慢来

我们看一下组合模式的相关设计模式,首先组合模式和访问者模式,那访问者模式我们在后面会讲,

这里面是一种组合应用,我们可以使用访问者模式,来访问组合模式的递归结构

猜你喜欢

转载自blog.csdn.net/Leon_Jinhai_Sun/article/details/90901433