一、是什么
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. 用同一的方式來遍歷,不暴露內部細節