组合模式就是几个模式组合一块儿吗?来看看组合模式原理

组合模式引导篇及组合模式原理java

在上一个《迭代器模式》中,咱们讲到了阿里收购网易考拉后,店铺合并的问题使用到了迭代器模式。如今又有了新需求。咱们先来看看新需求:设计模式

先说明:组合模式并不是是把以前学过的设计模式组合在一块儿的一种模式哈。别理解错了。数组

来源:凯哥Java(kaigejava)数据结构

在原有菜单的基础上,新增餐后甜点功能,如在中餐厅(DinerMenu)中添加餐后甜点。ide

咱们先来回顾下上一个模式下的类图,以下图:spa

document_image_rId9.png

从上图中,咱们能够知道,服务员手里拿的菜单遥控器,只是三个iterator 迭代器接口对象。设计

方案一:也是正常的,最容易想到的方案。orm

在DinerMenu菜单后面再追加一个子项,用来表示甜点的菜单。若是,咱们这样写了。其实最后,仍是使用的迭代器模式的。本篇,咱们讲解的是组合模式。因此,咱要玩点高大上的。咱使用组合模式来实现这个需求。对象

咱们还能够这么想,将甜点设计成一个数据结构,而后将这个数据结构,放到中餐厅菜单的其中一个菜单下,让甜点菜单成为其子菜单。类图以下:继承

document_image_rId10.png

当咱们点击dinnerMenu的第三个item的是,会弹出submenu,这样形式。

若是要实现,上面形式的数据结构,那么咱们原有系统会遇到的问题:

一:数据结构怎么设计?怎么遍历获取每个?

再上一个模式中,咱们知道,不管是List<Item>(cakeHouseMenu)、数组结构(DinerMenu)仍是hashTable结构的(cafeMenu)每个菜单都是一个item对象。这样好遍历,可是如今的是有些item下面带有子菜单,这个怎么遍历出来?有的是item菜单项,有的是带有子菜单,由于数据类型不一样的这是个问题。

由于涉及到了子菜单,也就有了父子关系的。再咱们数据结构中,存在父子关系的,最早能想到的就是树这种结构了。因此,咱们能够抽象的画出类图:

document_image_rId11.png

咱们使用树形结构,节点是菜单或子菜单,叶子是菜单项,须要可以在各个菜单项之间游走,遍历。要可以有弹性的在菜单项之间游走。

从上图中,咱们能够看出,在抽出一个超类,让叶子和含有叶子的节点都继承或实现这个超类。把原来存放item的都替换成抽出的超类,这样,整个体系中的数据类型都是同一个了。具体的,好比数组、list或者hashTable存放超类的子类。如,只放item的,咱们就只放菜单项,还有甜点的,咱们就放子菜单的。这样存储就统一了。

其实,组合模式的原理就是这样的。

凯哥我的博客:www.kaigejava.com


什么是组合模式:

组合模式又能够叫作部分-总体模式。是用于把一组相似的对象看成一个单一的对象。组合模式依据的是树形结构来组合对象,用来表示“部分或者是总体”的层次。

理解:

用于把一组相似的对象看成一个单一的对象什么意思呢?如咱们的单个菜单项和带有子菜单的菜单项,这两个实际上是一组相似的对象。咱们再提供给服务员的时候,无论是单个菜单项仍是带有子菜单的菜单项,对于服务员来讲都是一个单一的对象。这下理解了吧。

用来表示部分以及总体层次怎么理解?请看下图:

document_image_rId12.png

其中部分是超类的子类,总体也是超类的这类,因此,咱们在处理的时候,不管是子类仍是总体都看做是单一的超类。

因此,咱们能够获得组合模式其实须要解决的问题是:能让客户以一致的方法来处理个别对象以及对象组合的。简单理解就是:组合模式解决的问题是咱们能够忽略对象组合与个体对象之间的差异的。

咱们来看看,在组合模式下,新需求的类图:

document_image_rId13.png

从类图中,咱们能够看到,cakeHouseMenu继承于MenuComponent对象;cakeHouseMenu下面的item也是继承于MenuComponent对象。

本篇文章花了大量口舌来说解组合模式原理,但愿你们可以更好的理解原理。在下一篇文章中,咱们将使用代码来实现。

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息