Iterator Pattern

讓使用者能取得一個 collection 內的每個 element,而不需要暴露此 collection 的 implememtation。

Iterator Pattern 封裝了「拿出下一個 element」這件事,讓外部可以不需要知道 collection 實際上以什麼方式實作,如 array、list、stack 等等,就能以一致的方式取得 element。iterator 也讓 collection 的責任更簡單,collection 負責管理一群 object,而 iterator 負責 traverse element。

使用情境

有多種 collection 一同使用,希望能用同樣方式 traverse element 時。

UML

Iterator Pattern

library 及語言支援

C++ STL、Qt、Java 等等的 container 都有支援 iterator。用 iterator 要注意 iterate 過程中能不能更動該 container,因為 iterator 會直接或間接的 access container 內部資料,所以不同實作方式會影響 iterator 的使用。例如 Qt 對 container 用 implicit sharing,所以使用 iterator 期間 copy container 要注意會不會搞爛 iterator 或 iterator 指向的 container 跟預想不同。

在某些語言,如 PHP,會提供 foreach 的語法,這進一步將 iterator 變成 syntax 了。