Zastosowanie
Iterator
(ang. Iterator
) (wzorzec behawioralny) zapewnia sekwencyjny dostęp do grupy obiektów zawierających się w innym obiekcie (kontenerze) oraz umożliwia przechodzenie po tej samej strukturze danych na wiele sposobów. Kontener Container
dostarcza zgodny z typem przechowywanych danych obiekt Iterator
, który zapewnia dostęp do elementów kolekcji bez ujawniania jej reprezentacji. Niezależnie od typu kolekcji, jej elementy mogą być przetwarzane sekwencyjnie przy zachowaniu własności danej kolekcji. Konstrukcja pętli for-each
w sposób niejawny wywołuje Iterator
, co sprawia że wzorzec Iterator
jest standardowym elementem wielu języków programowania.
Ograniczenia
Ze względu na większą złożoność implementacji Iteratora
oraz mniejszą czytelność kodu w stosunku do zastosowania pętli for-each
zaleca się wykorzystanie konstrukcji for-each
o ile to możliwe. Ponadto Iterator
jest podatny na sytuację odwołania się do kolejnego elementu, który nie istnieje.
Użycie
Wzorzec Iterator
wykorzystywany jest wszędzie tam gdzie zachodzi potrzeba uniwersalnego dostępu do elementów kolekcji z pominięciem różnic w ich implementacji. Stosowany jest także, gdy użycie standardowej pętli for-each
jest niewystarczające ze względu na np.: brak iteracji w obu kierunkach czy też usuwania elementów z kolekcji w trakcie iteracji.
Implementacja
Klasa kolekcji elementów (o danej strukturze) implementuje interfejs Container
i dostarcza właściwą dla siebie instancję Iteratora
oraz jego implementacje w klasie wewnętrznej.
Poniższy listing przedstawia implementacje wzorca Iterator
dla kolekcji typu List
.
W celu wykonania operacji na elementach wybranej kolekcji, klient wywołuje jej Iterator
.
Przykład
Aplikacja FootballScore
prezentuje zestaw szczegółowych danych nt rozgrywek piłkarskich (w tym tabele oraz terminarze) w europejskich ligach oraz pucharach. W celu przedstawienia pełnej kolekcji informacji otrzymanych z serwera oraz umożliwieniu zastosowania filtrów, programista zdecydował o użyciu wzorca Iterator
. Ze względu na zastosowane typy kolekcji (np.: ArrayList
) pochodzące ze standardowego pakietu Java
, programista unika potrzeby tworzenia własnej implementacji Iterator
poprzez wykorzystanie tej dostarczonej przez wybraną kolekcję.
Biblioteki
Wszystkie implementacje Enumeration
, Iterator
, Spliterator
standardowego pakietu Java
, a zatem wszystkie kolekcje implementujące interfejs Iterable
realizują zadanie wzorca Iterator
. Ze względu na ich generyczność oraz dostępność, mogą być z powodzeniem zastosowane w wielu przypadkach bez konieczności tworzenia własnych interfejsów.