本文出自 http://blog.csdn.net/shuangde800
走進迭代器模式
迭代器幾乎是最常用的一種設計模式,在各物件導向語言中都有實現。
1. 迭代器首先需要一個迭代器的介面:
public interface Iterator { boolean hasNext(); // 會返回一個布爾值,讓我們知道是否還有更多的元素 Object next(); // next()方法會返回下一個元素}
一旦我們有了這個介面,就可以為各種對象集合實現迭代器:數組,列表,散列表……
2. 封裝一個數組的迭代器,並且假設這個數組是給某個餐廳的菜單服務:
public class DinerMenuIterator implements Iterator { MenuItem[] items; int position = 0; public DinerMenuIterator(MenuItem[] items) { this.items = items; } // next()方法返回數組內的下一項,並遞增其位置 public Object next() { MenuItem menuItem = items[position]; position = position + 1; return menuItem; } // hasNext()方法會檢查我們是否已經取得數組內的所有元素 public boolean hasNext() { if (position >= items.length || items[position] == null) { return false; } else { return true; } }}
3. 把迭代器組合進菜單。
public class DinerMenu implements Menu { static final int MAX_ITEMS = 6; int numberOfItems = 0; MenuItem[] menuItems; public DinerMenu() { menuItems = new MenuItem[MAX_ITEMS]; } public void addItem(String name, String description, boolean vegetarian, double price) { MenuItem menuItem = new MenuItem(name, description, vegetarian, price); if (numberOfItems >= MAX_ITEMS) { System.err.println("Sorry, menu is full! Can't add item to menu"); } else { menuItems[numberOfItems] = menuItem; numberOfItems = numberOfItems + 1; } } public MenuItem[] getMenuItems() { return menuItems; } // 這個方法擷取菜單的迭代器 public Iterator createIterator() { return new DinerMenuIterator(menuItems); } // other menu methods here}
5. 我們要列印出這個菜單的內容,只需要擷取它的迭代器即可遍曆出所有的功能表項目,並且輸出:
public class Waitress { // 這個方法為每個菜單各自建立一個迭代器 public void printMenu() { Iterator dinerIterator = dinerMenu.createIterator(); // 擷取迭代器 printMenu(dinerIterator); // 調用printMenu遍曆迭代器輸出內容 } private void printMenu(Iterator iterator) { while (iterator.hasNext()) { MenuItem menuItem = (MenuItem)iterator.next(); System.out.print(menuItem.getName() + ", "); System.out.print(menuItem.getPrice() + " -- "); System.out.println(menuItem.getDescription()); } }}
通過引入迭代器,菜單的實現已經被封裝起來,Waitress類不知道菜單是如何儲存功能表項目集合的。
有了迭代器,我們只需要一個迴圈,就可以多態地處理任何項的集合。
而且Waitress類現在只使用一個介面(迭代器)
定義迭代器模式
迭代器模式提供一種方法順序訪問一個彙總對象中的各個元素,而不是暴露出其內部的表示。
迭代器模式能夠讓我們遊走於彙總內的沒一個元素,而又不暴露其內部的表示
把遊走的任務放在迭代器上,而不是彙總上。這樣簡化了彙總的介面和實現,也讓責任各得其所。
設計原則:單一責任
一個類應該只有一個引起變化的原因
我們知道要避免類內的改變,因為修改代碼很容易造成許多潛在的錯誤。如果一個類具有兩個改變的原因,那麼這會使得將來該類的變化幾率上升,而當它真的改變時,你的設計中同時有兩個方面將會受到影響
內聚:用來度量一個類或模板緊密地達到單一目的或責任。當一個模板或一個類設計只支援一組相關的功能時,我們說它具有高內聚;反之具有低內聚。
迭代器意味著沒有次序。只是取出所有的元素,並不表示取出元素的先後就代表元素的大小次序。對於迭代器來說,資料結構可以是有次序的,也可以是沒有次序的,甚至資料可以是重複。除非某些集合有特別說明,否則不對迭代器取出的元素大小次序作出假設