目錄
1、核心思想
2、實現方式
2.1 模式結構
2.2 實現案例
3、優缺點分析
4、適用場景
1、核心思想
目的:將遍歷邏輯與數據存儲結構解耦
概念:提供一種機制來按順序訪問集合中的各元素,而不需要知道集合內部的構造
舉例:
1>?書籍目錄與翻頁:目錄是迭代器,讀者通過目錄按順序查找內容,無需了解書籍的章節存儲方式
2>?音樂播放列表:播放器通過“下一曲”按鈕遍歷歌曲列表,不關心列表是數組還是鏈表
2、實現方式
2.1 模式結構
四種核心角色:
- Iterator(迭代器接口)?:迭代器的接口標準,定義遍歷元素的方法,如next()、hasNext()等。
- ConcreteIterator(迭代器實現)?:迭代器接口Iterator的具體實現類,管理遍歷的當前位置和邏輯。
- Aggregate(集合接口)?:集合標準接口,一種具備迭代能力的指標。
- ConcreteAggregate(集合實現)?:實現集合接口Aggregate的具體集合類,可以實例化并返回一個迭代器以供外部使用(如
createIterator()
)。
2.2 實現案例
以遍歷自定義集合為例,實現正向和反向迭代器:
// 迭代器接口
interface Iterator<T> {boolean hasNext();T next();
}// 具體聚合類(集合)
class BookCollection {private String[] books = {"Java", "Python", "C++"};// 創建正向迭代器public Iterator<String> createForwardIterator() {return new ForwardIterator();}// 創建反向迭代器public Iterator<String> createReverseIterator() {return new ReverseIterator();}// 正向迭代器(私有內部類)private class ForwardIterator implements Iterator<String> {private int index = 0;@Overridepublic boolean hasNext() {return index < books.length;}@Overridepublic String next() {if (hasNext()) {return books[index++];}return null;}}// 反向迭代器(私有內部類)private class ReverseIterator implements Iterator<String> {private int index = books.length - 1;@Overridepublic boolean hasNext() {return index >= 0;}@Overridepublic String next() {if (hasNext()) {return books[index--];}return null;}}
}// 客戶端調用
public class Client {public static void main(String[] args) {BookCollection collection = new BookCollection();System.out.println("正向遍歷:");Iterator<String> forward = collection.createForwardIterator();while (forward.hasNext()) {System.out.println(forward.next());}System.out.println("\n反向遍歷:");Iterator<String> reverse = collection.createReverseIterator();while (reverse.hasNext()) {System.out.println(reverse.next());}}
}
關鍵點:
-
封裝遍歷細節:迭代器內部維護遍歷狀態(如當前索引),客戶端僅調用
hasNext()
和next()
。 -
支持多遍歷方式:同一集合可提供多種迭代器(如正向、反向、過濾等)。
3、優缺點分析
優點 | 缺點 |
---|---|
解耦客戶端代碼與集合結構 | 增加類的數量(迭代器需單獨實現) |
支持多種遍歷策略 | 簡單集合使用迭代器可能冗余 |
符合單一職責和開閉原則 |
4、適用場景
-
集合框架
-
Java的
Collection
通過Iterator
提供遍歷能力,如List.iterator()
。
-
List<String> list = Arrays.asList("A", "B", "C");
Iterator<String> it = list.iterator();
while (it.hasNext()) {System.out.println(it.next());
}
-
復雜數據結構遍歷
-
樹、圖等結構的深度優先(DFS)、廣度優先(BFS)遍歷。
-
class TreeNode {int val;TreeNode left, right;// 構造方法省略
}// 中序遍歷
class InOrderIterator implements Iterator<TreeNode> {private Stack<TreeNode> stack = new Stack<>();public InOrderIterator(TreeNode root) {pushLeft(root);}private void pushLeft(TreeNode node) {while (node != null) {stack.push(node);node = node.left;}}@Overridepublic boolean hasNext() {return !stack.isEmpty();}@Overridepublic TreeNode next() {TreeNode node = stack.pop();pushLeft(node.right); // 處理右子樹return node;}
}// 使用示例
TreeNode root = buildTree(); // 構建二叉樹
Iterator<TreeNode> it = new InOrderIterator(root);
while (it.hasNext()) {System.out.println(it.next().val);
}
-
數據庫查詢結果處理
-
遍歷查詢結果集(如JDBC的
ResultSet
)。
-
-
文件系統遍歷
-
遞歸遍歷目錄中的文件。
-
-
分頁加載數據
-
分批加載大數據集(如社交媒體的動態流)。
-