迭代器模式將遍歷邏輯從聚合對象中分離,實現「遍歷行為與數據結構解耦」。本文遞進式演示:自定義迭代器介面 → 內部類/匿名類實現 → 對接 JDK Iterator → 實現 Iterable 支持 for-each → 多策略迭代器(如僅遍歷偶數索引)。
public interface MyIterator<T> {
boolean end(); // 是否到達末尾
T current(); // 獲取當前元素
void next(); // 移動到下一個
}
Links 內部類 LinksIterator 封裝 ArrayList 索引邏輯,browser() 工廠方法返回實例。
Links2 直接在 browser() 中返回匿名實現,消除顯式內部類定義,代碼更緊湊。
public Iterator<T> iterator() {
return new Iterator<T>() {
private int index = 0;
public boolean hasNext() { return index < items.size(); }
public T next() { return items.get(index++); }
public void remove() { throw new UnsupportedOperationException(); }
};
}
三大核心方法:hasNext()、next()、remove()。僅讀場景拋出 UnsupportedOperationException 即可。
public class Links4<T> implements Iterable<T> {
public Iterator<T> iterator() { ... } // 同上
}
// 客戶端
for (Integer i : links) { ... } // 編譯器自動轉換為 iterator() 調用
Iterable 僅要求提供 iterator(),是 Foreach 語法糖的契約。
Links5 除默認 iterator() 外,額外提供 even() 返回 Iterable<T>,內部 next() 步長為 2:
for (Integer i : links.even()) { ... } // 僅輸出 1, 3, 5...
此模式允許同一聚合對象暴露多種遍歷視圖(逆序、過濾、分頁等),而不污染主迭代器邏輯。
Iterable 實現,不修改原類。java.util.Iterator + Iterable 即享受 Foreach、Stream API、第三方庫無縫互操作。