迭代器模式不僅是遍歷集合的工具,更體現「組合優於繼承」的設計智慧。本文通過《Head First 設計模式》經典雙餐廳合併案例,展示如何統一 ArrayList 與數組兩種不同數據結構的遍歷方式。
ArrayList 實現MenuItem[] 實現
public interface Menu {
public Iterator<MenuItem> createIterator();
}
public class BreakfastMenu implements Menu {
private ArrayList<MenuItem> menuItems;
@Override
public Iterator<MenuItem> createIterator() {
return menuItems.iterator(); // 直接復用集合迭代器
}
}
public class LunchMenu implements Menu {
private MenuItem[] menuItems;
@Override
public Iterator<MenuItem> createIterator() {
return new LunchIterator(menuItems); // 適配數組為迭代器
}
}
public class LunchIterator implements Iterator<MenuItem> {
private MenuItem[] menuItems;
private int position = 0;
public boolean hasNext() {
return position < menuItems.length && menuItems[position] != null;
}
public MenuItem next() {
return menuItems[position++];
}
}
public class Waitress {
private Menu menu;
public Waitress(Menu menu) { this.menu = menu; }
public void printMenu() {
Iterator<MenuItem> iterator = menu.createIterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
這就是迭代器模式的威力:為不同聚合對象提供統一遍歷介面,且不暴露內部結構。GitHub完整代碼:DesignPattern-Iterator