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.

Stránku naposledy upravoval Lubos Pavlicek, 16.06.2005, 19:04