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
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 了。