迭代器模式的理解和示例


一、是什么

1. 定義: 在對象集合之間游走,而不暴露集合的實現

二、示例

代理背景:

  1. 有漢堡包店和晚餐店的菜單, 假設漢堡包店的菜單是用List存放, 晚餐店是用數組存放的(用不同的存放方式,為了體現迭代器統一的處理方式)

  2. 服務生要將兩家店的菜單都打印出來 

  3. 這里先自己重寫Iterator, 為了體現迭代器的設計模式,在實際使用中,可以直接循環Iterator

2.1 菜單項 Menu, 菜單有名稱和價格

/**
 * 菜單
 */
public class Menu {
   private String name;
   private Double price;

    public Menu(String name, Double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }
}

2.2 晚餐店, 注意這里是用數組存放菜單的

/**
 * 晚餐店
 */
public class DinnerShop {

    private static final int MAX_ITEMS = 4;
    int index = 0;
    Menu[] menuItems;

    public DinnerShop() {
        menuItems = new Menu[MAX_ITEMS];

        // 默認就放入菜單項
        addItem("浪漫晚餐", 299d);
        addItem("小龍蝦", 99d);
        addItem("魷魚", 49d);
        addItem("扇貝", 89d);
    }

    public void addItem(String name, double price) {
        Menu menu = new Menu(name, price);
        if (index >= MAX_ITEMS) {
            System.err.println("對不起, 菜單頁滿了");
        } else {
            menuItems[index] = menu;
            index++;
        }
    }

    // 創建迭代器:重點
    public Iterator createIteraotr() {
        return new DinnerMenuIterator(menuItems);
    }
}

晚餐點菜單迭代器, 重寫next()和hasNext()方法

/**
 * 晚餐菜單遍歷類
 */
public class DinnerMenuIterator implements Iterator {
    Menu[] menuItems;
    int position = 0;

    public DinnerMenuIterator(Menu[] menuItems) {
        this.menuItems = menuItems;
    }

    @Override
    public boolean hasNext() {
        if (position >= menuItems.length || menuItems[position] == null) {
            return false;
        }

        return true;
    }

    @Override
    public Object next() {
        Menu menuItem = menuItems[position];
        position++;
        return menuItem;
    }
}

2.3 漢堡包店, 這里用List存放菜單

/**
 * 漢堡店菜單
 */
public class PancakeHouseShop {

    /**
     * 菜單列表
     */
    List<Menu> menuItems;

    public PancakeHouseShop() {
        this.menuItems = new ArrayList<>();

        // 默認就放入菜單項
        addItem("可樂", 3d);
        addItem("漢堡", 13d);
        addItem("薯條", 8d);
        addItem("雞翅", 5d);
    }

    public void addItem(String name, Double price) {
        Menu menu = new Menu(name, price);
        menuItems.add(menu);
    }

    // 產生迭代器
    public Iterator createIterator() {
        return new PancakeHouseMenuIterator(menuItems);
    }
}

漢堡包店迭代器

/**
 * 漢堡包菜單迭代類
 */
public class PancakeHouseMenuIterator implements Iterator {
    List<Menu> menuItems;
    int position = 0;

    public PancakeHouseMenuIterator(List<Menu> menuItems) {
        this.menuItems = menuItems;
    }

    @Override
    public boolean hasNext() {
        if (position >= menuItems.size() || menuItems.get(position) == null) {
            return false;
        }

        return true;
    }

    @Override
    public Object next() {
        Menu menuItem = menuItems.get(position);
        position++;

        return menuItem;
    }
}

2.4 測試類:服務生

/**
 * 服務生
 */
public class Waiter {

    public void print() {
        System.out.println("================== 漢堡包菜單 ======================");
        PancakeHouseShop pancakeHouseShop = new PancakeHouseShop();
        Iterator pancakeHouseMenuIterator = pancakeHouseShop.createIterator();
        printMenu(pancakeHouseMenuIterator);

        System.out.println("=================== 晚餐菜單 =====================");
        DinnerShop dinnerShop = new DinnerShop();
        Iterator dinnerMenuIterator = dinnerShop.createIteraotr();
        printMenu(dinnerMenuIterator);
    }

    private void printMenu(Iterator iterator) {
        while (iterator.hasNext()) {
            Menu menu = (Menu) iterator.next();
            System.out.println("名稱: " + menu.getName() + "======== 價格: " + menu.getPrice());
        }
    }

    public static void main(String[] args) {
        Waiter waiter = new Waiter();
        waiter.print();
    }
}

控制台打印:

================== 漢堡包菜單 ======================
名稱: 可樂======== 價格: 3.0
名稱: 漢堡======== 價格: 13.0
名稱: 薯條======== 價格: 8.0
名稱: 雞翅======== 價格: 5.0
=================== 晚餐菜單 =====================
名稱: 浪漫晚餐======== 價格: 299.0
名稱: 小龍蝦======== 價格: 99.0
名稱: 魷魚======== 價格: 49.0
名稱: 扇貝======== 價格: 89.0

 
        

三、總結

1. 這里沒有用直接將數組和List生成Iterator, 是為了更方便的看出迭代器的作用

2. 用同一的方式來遍歷,不暴露內部細節


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM