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
![]()