对象村餐厅和对象村煎饼屋合并啦!
合并是个好事情,但是餐厅老板做的菜单使用的是ArrayList,而煎饼屋老板的菜单实现用的却是数组,不过他们的菜单项类倒是一致的,这时实现女招待的代码中,如果客户想查看新公司的所有菜单,在女招待代码中就必须针对这两种不同的实现,分别写循环遍历,而且女招待必须熟悉不同原老板的实现(违反封装特性),如果又加入一个新的蛋糕店采用Hash表,则女招待代码需要改很多!!
看一下新版女招待的实现方式:
以上的实现,这两份菜单的接口完全一样,但没有为它们设计一个共同的接口。为使得女招待代码更加干净些,我们可以使用Java的Iterator接口。
在多线程情况下使用迭代器必须非常小心,迭代器的remove()会造成难以预料的影响!!!
2、迭代器模式
把遍历的任务放在迭代器上,而不是聚合上,这样简化了聚合的接口和实现,也让责任各得其所。
3、设计原则
如果有1个类有2个改变的原因,这会使得将来该类变化的几率上升,即如果聚合中既实现了管理的代码又有遍历的代码,就存在两个改变的原因
内聚用来度量一个类或模块紧密地达到单一目的或责任
当一个模块或一个类被设计成仅支持一组相关的功能时,我们说它具有高内聚,反之,当被设计成支持一组不相关功能时,我们说它具有低内聚。
新的改进,因为女招待里面包含3个菜单,依然有些臃肿,我们可以把这些菜单都加入一个ArrayList然后赋给女招待,女招待可以先从这个ArrayList的Iterator里面找出菜单,然后再遍历每个菜单输出每个菜单项。
4、新的需求
菜单中可能包含子菜单咋办呢?
组合模式让我们能用树形方式创建对象的结构,树里面包含了组合以及个别的对象。使用组合结构,我们能把相同的操作应用在组合和个别对象上,换句话说,大多数情况下,我们可以忽略对象组合和个别对象之间的差别。
5、组合模式类图