Head First 设计模式 —— 10. 迭代器 (Iter

2021-01-13  本文已影响0人  满赋诸机

思考题

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

思考题

请继续完成 PancakeHouseIterator 的实现,并对 PancakeHouseMenu 类做出必要的修改。 P327

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

10. 迭代器模式
特点

思考题

迭代器模式的类图看起来很像我们所学过的另一个模式;你知道是哪个模式吗?提示:子类决定要创建哪个对象。 P337

设计原则

单一职责原则:一个类应该只有一个引起变化的原因 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;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读