设计模式中的组合模式怎么理解
1、在上一个《迭代器模式》中,我们讲到了阿里收购网易考拉后,店铺合并的问题使用到了迭代器模式。现在又有了新需求。我们先来看看新需求:先说明:组合模式并非是把之前学过的设计模式组合再一起的一种模式哈。别理解错了。在原有菜单的基础上,新增餐后甜点功能,如在中餐厅(DinerMenu)中添加餐后甜点。我们先来回顾下上一个模式下的类图,如下图:

3、当我们点击dinnerMenu的第三个item的是,会弹出submenu,这样形式。如果要实现,上面形式的数据结构,那么我们原有系统会遇到的问题:一:数据结构怎么设计?怎么遍历获取每一个?再上一个模式中,我们知道,无论是List<Item>(cakeHouseMenu)、数组结构(DinerMenu)还是hashTable结构的(cafeMenu)每一个菜单都是一个item对象。这样好遍历,但是现在的是有些item下面带有子菜单,这个怎么遍历出来?有的是item菜单项,有的是带有子菜单,因为数据类型不同的这是个问题。因为涉及到了子菜单,也就有了父子关系的。再我们数据结构中,存在父子关系的,最先能想到的就是树这种结构了。所以,我们可以抽象的画出类图:

5、其中部分是超类的子类,整体也是超类的这类,所以,我们在处理的时候,无论是子类还是整体都看作是单一的超类。所以,我们可以得到组合模式其实需要解决的问题是:能让客户以一致的方法来处理个别对象以及对象组合的。简单理解就是:组合模式解决的问题是我们可以忽略对象组合与个体对象之间的差别的。我们来看看,在组合模式下,新需求的类图:

6、从类图中,我们可以看到,cakeHouseMenu继承于MenuComponent对象;cakeHouseMenu下面的item也是继承于MenuComponent对象。本篇文章花了大量口舌来讲解组合模式原理,希望大家能够更好的理解原理。在下一篇文章中,我们将使用代码来实现。