迭代器模式提供一種方法順序訪問聚合對象中的各個元素,而無需暴露該對象的內部表示。它是 Java 集合框架的基石,Collection.iterator() 正是其標準實踐。
iterator() 方法,如 Collection、List、Set。ArrayList、HashSet、LinkedList。hasNext()、next()、remove()。interface Iterator { Object next(); boolean hasNext(); }
interface Aggregate { void add(Object o); void remove(Object o); Iterator iterator(); }
class ConcreteAggregate implements Aggregate {
private List<Object> list = new ArrayList<>();
public void add(Object o) { list.add(o); }
public void remove(Object o) { list.remove(o); }
public Iterator iterator() { return new ConcreteIterator(list); }
}
class ConcreteIterator implements Iterator {
private List<Object> list; private int cursor = 0;
public ConcreteIterator(List<Object> list) { this.list = list; }
public boolean hasNext() { return cursor < list.size(); }
public Object next() { return hasNext() ? list.get(cursor++) : null; }
}
容器可提供不同迭代器實現:正序、逆序、過濾、分頁等,客戶端無感知切換:
// 逆序迭代器示例
class ReverseIterator implements Iterator {
private List<Object> list; private int index;
public ReverseIterator(List<Object> list) { this.list = list; index = list.size()-1; }
public boolean hasNext() { return index >= 0; }
public Object next() { return hasNext() ? list.get(index--) : null; }
}
| 優點 | 缺點 |
|---|---|
| 統一遍歷接口,屏蔽底層數據結構差異 | 簡單數組/列表用 for 循環更直觀高效 | 支援多種遍歷策略,擴展性強 | 引入額外類增加系統複雜度 | 封裝性好,符合單一職責原則 | 并發修改時需額外機制保證安全 |
現代 Java 開發建議:優先使用語言內建迭代器(for-each、Stream API),僅在實現自定義容器或特殊遍歷邏輯時手寫迭代器。
迭代器模式將「如何遍歷」從「數據結構」中分離,是集合框架設計的經典範例。理解其原理有助於深入掌握 Java 集合源碼,並在需要自定義遍歷時做出正確設計決策。