public void printMenu() { PancakeHouseMenu pancakeHouseMenu = new PancakeHouseMenu(); ArrayList breakfastItems = pancakeHouseMenu.getMenuItems(); DinerMenu dinerMenu = new DinerMenu(); MenuItem[] lunchItems = dinerMenu.getMenuItems(); for (int i = 0; i < breakfastItems.size(); ++i) { MenuItem menuItem = (MenuItem) breakfastItems.get(i); System.out.print(menuItem.getName() + " "); System.out.println(menuItem.getPrice() + " "); System.out.println(menuItem.getDescription()); } for (int i = 0; i < lunchItems.length; ++i) { MenuItem menuItem = lunchItems[i]; System.out.print(menuItem.getName() + " "); System.out.println(menuItem.getPrice() + " "); System.out.println(menuItem.getDescription()); } }
根据咱们的 printMenu()
实现,下列哪一项为真? P322
java
[x] A. 咱们是针对 PancakeHouseMenu
和 DinerMenu
的具体实现编码,而不是针对接口。git
[ ] B. 女招待没有实现 Java 招待 API ,因此她没有遵照标准。github
[x] C. 若是咱们决定从 DinerMenu
切换到另外一种菜单,此菜单的项是用 Hashtable
来存放的,咱们会所以须要修改女招待中的许多代码。编程
Hashtable
是一种新的具体实现,须要修改代码进行适配[x] D. 女招待须要知道每一个菜单如何表达内部的菜单项集合,这违反了封装。segmentfault
[x] E. 咱们有重复的代码; printMenu()
方法须要两个循环,来遍历两种不一样的菜单。若是咱们加上第三种菜单,咱们就须要第三个循环。框架
[ ] F. 这个实现并无基于 MXML(Menu XML),因此就没有办法互操做。ide
The implementation isn't based on MXML(Menu XML) and so isn't as interoperable as it shoule be.
请继续完成 PancakeHouseIterator
的实现,并对 PancakeHouseMenu
类作出必要的修改。 P327
this
public class PancakeHouseIterator implements Iterator { ArrayList items; int position = 0; public PancakeHouseIterator(ArrayList items) { this.items = items; } public Object next() { return items.get(position++); } public boolean hasNext() { return position >= items.size(); } } public class PancakeHouseMenu { ArrayList menuItems; // 构造器和其余方法 // 移除 public ArrayList getMenuItems() 方法 public Iterator createIterator() { return new PancakeHouseIterator(menuItems); } }
提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。 P336
编码
P336
P336
P336
迭代器模式的类图看起来很像咱们所学过的另外一个模式;你知道是哪一个模式吗?提示:子类决定要建立哪一个对象。 P337
idea
单一职责原则:一个类应该只有一个引发变化的缘由 P339
P339
P339
P339
请很快写下为了能让咖啡厅的菜单代码符合咱们的框架,咱们要对它作的三件事情: P342
public class CafeMenu { HashTable menuItems = new Hashtable(); public CafeMenu() { // 省略下述参数 // addItem(...); // addItem(...); // addItem(...); } public void addItem(String name, String description, boolean vegetarian, double price) { MenuItem menuItem = new MenuItem(name, description, vegetarian, price); menuItems.put(menuItem.getName(), menuItem); } public Hashtable getItems() { return menuItems; } }
Menu
接口getItems()
方法createIterator()
方法本文首发于公众号:满赋诸机( 点击查看原文) 开源在 GitHub : reading-notes/head-first-design-patterns
![]()