1. 程式人生 > 實用技巧 >迭代器模式

迭代器模式

迭代器模式是針對集合物件而生的,對於集合物件而言,肯定會涉及到對集合的新增和刪除操作,同時也肯定支援遍歷集合元素的操作,我們此時可以把遍歷操作放在集合物件中,但這樣的話,集合物件既承擔太多的責任了,面向物件設計原則中有一條就是單一職責原則,所有我們要儘可能地分離這些職責,用不同的類取承擔不同的責任,迭代器模式就是用迭代器類來承擔遍歷集合的職責。

定義:迭代器模式提供了一種方法順序訪問一個聚合物件中的各個元素,而又無需暴露該物件的內部實現,這樣既可以做到不暴露集合的內部結構,又可讓外部程式碼透明地訪問集合內部的資料

/**
 * 選單
 */
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; } }

/**
 * 晚餐店
 */
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); } }

/**
 * 晚餐選單遍歷類
 */
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;
    }
}

/**
 * 漢堡店選單
 */
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;
    }
}
/**
 * 服務生
 */
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