Návrhové vzory (design patterns) - diplomová práce M. Dvořáka
Iterator Pattern
SKUPINA: Behavioral Patterns
Problém
Řeší problém, jak se pohybovat mezi prvky, které jsou sekvenčně uspořádány, bez znalosti implementace jednotlivých prvků posloupnosti.
Podmínky
Iterator je jeden z nejjednodušších, ale nejvíce používaných návrhových vzorů. Vysvětluje možnost způsob sekvenční pohybu v seznamu objektů. Pro tento pohyb není nutné znát detailní implementaci dat v seznamu, jelikož jeho průchod není zajišťován přímo tímto seznamem.
Řešení

Iterator je rozhraní, které definuje metody pro průchod seznamem. Mezi metody může patřit přechod na první záznam, na další záznam v sekvenci, kontrola, jestli existuje další záznam nebo předání odkazu na aktivní záznam. Protože toto rozhraní definujeme sami, je možné použít i více sofistikované metody. Rozhraní Iterator je implementováno třídou Concrete Iterator, která zajišťuje průchodnost kolekcí. Při vytváření Concrete Iterator je mu předán odkaz na seznam, v němž bude zajišťovat průchodnost. Rozhraní Aggregate je implementováno třídou Concrete Aggregate, která je seznam a v návrhovém vzoru představuje nositele dat. Client vytváří tento seznam a naplní ho daty. Potom požádá o vytvoření objektu Concrete Iterator, který mu umožní procházet seznam a získávat jednotlivé položky.
Příklad
Příkladem tohoto návrhového vzoru je spouštění jednotlivých služeb v příkladě aplikačního frameworku analyzovaného na konci práce. Tyto služby jsou spouštěny sekvenčně před každým voláním use-case. Bližší popis viz Vybrané komponenty frameworku kapitola Globální služby pomocí Iteratoru.
Výsledek
Vytvoření dvou rozdílných tříd typu Aggregate a Iterator jsme oddělili úložiště dat od místa, kde je zajišťována manipulace s těmito daty. Tímto je možné snadno implementovat změny v procesu procházení kolekcí bez nutnosti cokoliv měnit na samotné kolekci.
Odůvodnění a souvislosti
Iterator nám dává možnost implementovat průchod kolekcí dle vlastních potřeb. Klient je odstíněn od logiky pohybu seznamem a není pro něho zajímavé jakým způsobem získá následující položku. Jelikož si každý objekt typu Iterator uchovává vlastní pozici v kolekci, můžeme mít více procesů, které prochází stejný seznam dat současně. Například Concrete Iterator I. je na pozici 3, ale Concrete Iterator II. na pozici 15.
V objektu Iterator je možné také filtrovat data a předávat klientům již pouze relevantní údaje. Problémem, který nastává u průchodu kolekcí, je její změna. Musí být zajištěn mechanismus, jak upozornit Concrete Iterator, že kolekce byla změněna.
Související vzory
- Composite - je vhodné využít Iterator pro průchod stromovou strukturou.
- Memento - Iterator může tento vzor využít k uchování pozice, na které se nyní nachází.
Reference
- java.util.Enumeration - rozhraní, která definuje metody pro průchod seznamem. Příkladem implementace rozhraní Enumeration je třída StringTokenizer.
- java.util.Iterator - od verze JDK 1.2 je možné použít rozhraní Iterator, které je obdobou pro Enumeration. Spolu s rozhraním java.util.Collection vytváří framework pro práci se seznamy.
