迭代器模式 提供一種方法順序訪問一個聚合對象中的各個對象,而不暴露其內部的表示。 把游走的任務放在迭代器上,而不是聚合上。這樣簡化了聚合的介面和實現,也讓責任各得其所。 迭代器模式 提供一種方法順序訪問一個聚合對象中的各個對象,而不暴露其內部的表示。 把游走的任務放在迭代器上,而不是聚合上。這樣簡化 ...
迭代器模式 提供一種方法順序訪問一個聚合對象中的各個對象,而不暴露其內部的表示。 把游走的任務放在迭代器上,而不是聚合上。這樣簡化了聚合的介面和實現,也讓責任各得其所。 角色: 容器角色:負責提供創建具體迭代器角色的介面; 具體容器角色:實現創建具體迭代器角色的介面, 這個具體迭代器角色與該容器的結構相關; 迭代器角色(Iterator):負責定義訪問和遍歷元素的介面; 具體迭代器角色(Concrete Iterator):實現迭代器介面中定義的方法,完成集合的迭代。
優點:
1、簡化了遍歷方式,對於對象集合的遍歷,還是比較麻煩的,對於數組或者有序列表,我們尚可以通過游標來取得,但用戶需要在對集合瞭解很清楚的前提下,自行遍歷對象,但是對於hash表來說,用戶遍歷起來就比較麻煩了。而引入了迭代器方法後,用戶用起來就簡單的多了。 2、可以提供多種遍歷方式,比如說對有序列表,我們可以根據需要提供正序遍歷,倒序遍歷兩種迭代器,用戶用起來只需要得到我們實現好的迭代器,就可以方便的對集合進行遍歷了。 3、封裝性良好,用戶只需要得到迭代器就可以遍歷,而對於遍歷演算法則不用去關心。缺點:
1、對於比較簡單的遍歷(像數組或者有序列表),使用迭代器方式遍歷較為繁瑣,大家可能都有感覺,像ArrayList,我們寧可願意使用for迴圈和get方法來遍歷集合。場景:
迭代器模式是與集合共生共死的,一般來說,我們只要實現一個集合,就需要同時提供這個集合的迭代器,就像java中的Collection,List、Set、Map等,這些集合都有自己的迭代器。假如我們要實現一個這樣的新的容器,當然也需要引入迭代器模式,給我們的容器實現一個迭代器。
但是,由於容器與迭代器的關係太密切了,所以大多數語言在實現容器的時候都給提供了迭代器,並且這些語言提供的容器和迭代器在絕大多數情況下就可以滿足我們的需要,所以現在需要我們自己去實踐迭代器模式的場景還是比較少見的,我們只需要使用語言中已有的容器和迭代器就可以了。
/** * 迭代器角色 * */ public interface Iterator { boolean hasNext(); Object next(); } |
/** * 菜單項 * */ public class MenuItem { String name; String description; // 是否為素食 boolean vegetarion; double price; public MenuItem(String name, String description, boolean vegetarion, double price) { this.name = name; this.description = description; this.vegetarion = vegetarion; this.price = price; } public String getName() { return name; } public String getDescription() { return description; } public boolean isVegetarion() { return vegetarion; } public double getPrice() { return price; } } |
/** * 餐廳菜單 * */ public class DinerMenu { static final int MAX_ITEMS = 6; int numOfItems = 0; MenuItem[] items; public DinerMenu(MenuItem[] items){ this.items = items; } public Iterator createIterator() { return new DinerMenuIterator(items); } } |
public class PancakeHouseMenu { static final int MAX_ITEMS = 6; int numOfItems = 0; ArrayList<MenuItem> items; public PancakeHouseMenu(ArrayList<MenuItem> items){ this.items = items; } public Iterator createIterator() { return new PancakeHouseIterator(items); } } |
/** * 餐廳菜單迭代器 具體迭代器角色 * */ public class DinerMenuIterator implements Iterator{ MenuItem[] items; int position = 0; public DinerMenuIterator(MenuItem[] items) { this.items = items; } public boolean hasNext() { if(position >= items.length || items[position] == null) { return false; } return true; } public Object next() { MenuItem item = items[position]; position++; return item; } } |
/** * 煎餅屋菜單迭代器 * */ public class PancakeHouseIterator implements Iterator{ ArrayList<MenuItem> items; int position = 0; public PancakeHouseIterator(ArrayList<MenuItem> items) { this.items = items; } public boolean hasNext() { if(position >= items.size() || items.get(position) == null) { return false; } return true; } public Object next() { MenuItem item = items.get(position); position++; return item; } } |
public class Waitress { DinerMenu dinerMenu; PancakeHouseMenu pancakeMenu; public Waitress(DinerMenu dinerMenu, PancakeHouseMenu pancakeMenu) { this.dinerMenu = dinerMenu; this.pancakeMenu = pancakeMenu; } public void printMenu() { Iterator dinerIterator = dinerMenu.createIterator(); Iterator pancakeIterator = pancakeMenu.createIterator(); System.out.println("Diner menu......"); printMenu(dinerIterator); System.out.println("Pancake House Menu......"); printMenu(pancakeIterator); } private void printMenu(Iterator iterator){ MenuItem item; while(iterator.hasNext()) { item = (MenuItem) iterator.next(); System.out.print("Name : "+ item.getName() +", "); System.out.println("Price : "+ item.getPrice()); } } } |
public class Client { public static void main(String[] args) { ArrayList<MenuItem> pancakeItems = new ArrayList<MenuItem>(); pancakeItems.add(new MenuItem("乾鍋土豆" , "", false, 10)); pancakeItems.add(new MenuItem("巫山烤魚", "", true, 30)); pancakeItems.add(new MenuItem("熗炒土豆絲", "", false, 20)); PancakeHouseMenu pancakeMenu = new PancakeHouseMenu(pancakeItems); MenuItem[] dinerItems = new MenuItem[3]; dinerItems[0] = new MenuItem("煎餅", "", false, 5); dinerItems[1] = new MenuItem("綠豆粥", "", false, 3); dinerItems[2] = new MenuItem("鹹菜", "", false, 5); DinerMenu dinerMenu = new DinerMenu(dinerItems); Waitress waitress = new Waitress(dinerMenu, pancakeMenu); waitress.printMenu(); } } |