🎯 什麼情境該想到我
當你「想依序走過一個集合裡的每個元素,卻不想(也不該)知道它內部到底是用陣列、鏈結串列、樹還是雜湊表存的」的時候,或想對同一個集合支援多種走訪方式並統一走訪介面。
⚙️ 怎麼用(步驟 / 公式)
意圖:提供一種方法,循序存取一個聚合物件中的各個元素,而又不暴露該物件的內部表示。
主要參與者 / 結構:
- Iterator(迭代器介面):宣告
hasNext()、next()(有時含first()、current())。 - ConcreteIterator(具體迭代器):實作走訪邏輯,並記住目前走到哪。
- Aggregate(聚合介面):宣告
createIterator()。 - ConcreteAggregate(具體聚合):回傳一個能走訪自己的具體迭代器。
做法要點:
- 把「走訪的狀態與邏輯」從集合本身抽出,放進獨立的迭代器物件。
- 客戶端只透過 Iterator 介面走訪,不碰集合內部。
- 同一集合可提供多個迭代器(不同順序、可同時多個各自獨立走訪)。
🧪 我實際套用的紀錄
- (待填)
⚠️ 注意 / 什麼時候不適用
- 現代語言大多內建迭代機制(
foreach、for...of、iterator/generator),通常直接用語言機制即可,不必自己造。 - 走訪過程中若修改集合,可能導致迭代器失效或行為未定義。
- 對極簡單、固定的小集合,手寫迴圈反而更直接。
🔗 相關工具
- 組合模式 Composite(常用迭代器走訪組合出來的樹狀結構)
- 訪問者模式 Visitor(迭代器負責「走到每個元素」,訪問者負責「對每個元素做事」)
- 備忘錄模式 Memento(可用來保存迭代器的走訪狀態)
- 工具-針對介面編程(客戶端只依賴 Iterator 介面,與容器實作解耦)
- 設計模式