迭代器与组合模式

对象村餐厅和对象村煎饼屋合并啦!

合并是个好事情,但是餐厅老板做的菜单使用的是ArrayList,而煎饼屋老板的菜单实现用的却是数组,不过他们的菜单项类倒是一致的,这时实现女招待的代码中,如果客户想查看新公司的所有菜单,在女招待代码中就必须针对这两种不同的实现,分别写循环遍历,而且女招待必须熟悉不同原老板的实现(违反封装特性),如果又加入一个新的蛋糕店采用Hash表,则女招待代码需要改很多!!

 

看一下新版女招待的实现方式:

以上的实现,这两份菜单的接口完全一样,但没有为它们设计一个共同的接口。为使得女招待代码更加干净些,我们可以使用Java的Iterator接口。

 

在多线程情况下使用迭代器必须非常小心,迭代器的remove()会造成难以预料的影响!!!

 

 

2、迭代器模式

把遍历的任务放在迭代器上,而不是聚合上,这样简化了聚合的接口和实现,也让责任各得其所。

 

 

 

3、设计原则

如果有1个类有2个改变的原因,这会使得将来该类变化的几率上升,即如果聚合中既实现了管理的代码又有遍历的代码,就存在两个改变的原因

 

内聚用来度量一个类或模块紧密地达到单一目的或责任

当一个模块或一个类被设计成仅支持一组相关的功能时,我们说它具有高内聚,反之,当被设计成支持一组不相关功能时,我们说它具有低内聚。

 

新的改进,因为女招待里面包含3个菜单,依然有些臃肿,我们可以把这些菜单都加入一个ArrayList然后赋给女招待,女招待可以先从这个ArrayList的Iterator里面找出菜单,然后再遍历每个菜单输出每个菜单项。

 

 

 

4、新的需求

菜单中可能包含子菜单咋办呢?

 

 

组合模式让我们能用树形方式创建对象的结构,树里面包含了组合以及个别的对象。使用组合结构,我们能把相同的操作应用在组合和个别对象上,换句话说,大多数情况下,我们可以忽略对象组合和个别对象之间的差别。

 

5、组合模式类图

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值