迭代器模式与组合模式(一) —— Head First设计模式学习

本文介绍了如何使用迭代器模式和组合模式改进菜单系统的代码结构。通过创建MenuItem类作为菜单项,PancakeHouseMenu和DinerMenu类作为菜单,展示了菜单的初始化和显示。然而,现有的Waitress_1ed类存在针对具体实现编程、封装性差和重复代码等问题。为了解决这些问题,文章提出了采用迭代器模式,以便更灵活地遍历不同类型的菜单,提高代码的可维护性和扩展性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

首先,我们有三个类,分别代表“菜单项”,“对象村餐厅菜单”和“对象村煎饼屋菜单”。

菜单类:

 

 

对象村煎饼屋菜单:

 

 

对象村餐厅菜单:

 

 

由于对象村餐厅和煎饼屋合并后,煎饼屋提供早餐,而餐厅提供午餐。需要一个女招待Alice。

Alice 的工作如下:

printMenu()

--打印出菜单上的每一项

printBreakfastMenu()

--只打印早餐项

printLunchMenu()

--只打印午餐项

printVegetarianMenu()

--打印所有的素食菜单项

isItemVegetarian(name)

--制定项的名称,如果是素食的话,返回true,否则返回false

 

以下是我们女招待的实现类:

 

 

在该类只实现了printMenu方法,其他方法与printMenu方法类似,都要循环遍历两个菜单项。如果,还有第三家餐厅合并,就需要三个循环遍历。

printMenu()的实现,会有以下几个问题:

  1. 针对接口编程,而非针对实现编程。printMenu()的实现是针对PancakeHouseMenu和DinerMenu的具体代码实现编码。
  2. 如果我们还有另一种菜单项用Hashtable来存放,我们会因此需要修改女招待中的许多代码。
  3. 女招待需要知道每个菜单如何表达内部的菜单项集合,这违背了封装。
  4. 重复代码比较多,printMenu()方法中需要两个循环,来遍历两种不同的菜单。如果还有第三种菜单,我们就需要第三个循环。

对此,我们应该如何处理呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值