Entwurfsmuster / Design Pattern: Der Iterator (Iterator)

avatar

Als letzte Gruppe von Entwurfsmustern gibt es noch die Verhaltensmuster. Verhaltensmuster beschreiben, wie eine gegebene Funktionalität auf Verantwortlichkeiten unterschiedlicher Klassen bzw. ihrer Instanzen abgebildet werden kann.
Zusätzlich zu den in Strukturmustern dargestellten reinen Klassen- bzw. Objektstrukturen beschreiben Verhaltensmuster insbesondere auch den Nachrichtenaustausch innerhalb solcher Strukturen.

Es wird der Iterator als einer der Verhaltensmuster vorgestellt.

Zweck

Stellt den Zugriff auf die einzelnen Elemente einer Struktur zur Verfügung, ohne die Implementierung der Struktur offenzulegen.

Motivation

Ein Behälterobjekt (container), wie z. B. eine Liste, sollte Operationen zum Zugriff auf ihre Elemente zur Verfügung stellen, ohne dass die interne Implementierung sichtbar wird. Es kann sein, dass die Liste auf unterschiedliche Weisen durchlaufen werden soll (z. B. vorwärts und rückwärts), oder dass mehrere Durchläufe parallel stattfinden müssen.
Das Iterator-Muster ermöglicht dies, indem die Verantwortung für den Zugriff und das Durchlaufen des Behälters aus dem Behälterobjekt in ein sog. Iteratorobjekt verschoben wird. Das Iteratorobjekt merkt sich die aktuelle Position des Durchlaufs bzw. kennt die bereits besuchten Objekte. Der Zugriff auf das Behälterobjekt und auf das Iteratorobjekt erfolgt über Interfaces, damit die Implementierung für den Dienstnutzer
verborgen und dadurch austauschbar ist.

Da der Dienstnutzer nur auf die Interfaces Set und Iterator zugreift, bleibt für ihn sowohl die Implementierung des Sets (z. B. HashSet oder TreeSet) als auch die Implementierung des Iterators (z. B. HashIterator oder TreeIterator) verborgen.

4iterator.png
Abbildung: Ein Beispiel eines Iterators

Anwendbarkeit

Man benutzt das Iterator-Muster,

  • um auf die Elemente eines Behälterobjekts zuzugreifen, ohne die interne Realisierung zu kennen
  • um mehrere parallele Durchläufe durch den Behälter zu ermöglichen
  • um ein einheitliches Interface zum Durchlaufen verschiedener Behälterstrukturen zu verwenden

Konsequenzen

  • Es ermöglicht verschiedene Arten eines Behälterdurchlaufs. Beispielsweise kann eine Baumstruktur in verschiedenen Reihenfolgen (z. B. inorder, preorder oder postorder) durchlaufen werden. Iteratoren machen es einfach, den Durchlaufalgorithmus auszutauschen: Man tauscht einfach das Iteratorobjekt gegen ein anderes aus, das ebenfalls das Iterator-Interface implementiert.
  • Iteratoren vereinfachen die Schnittstelle von Behältern, da anstelle der Durchlaufoperationen nur noch eine Operation erforderlich ist, die den Iterator erzeugt.
  • Da ein Iterator den aktuellen Durchlaufzustand speichert, können mehrere Durchläufe durch einen Behälter parallel stattfinden.

Quelle
Frank Buschmann, Regine Meunier, Hans Rohnert, Peter Sommerlad, Michael Stal Pattern-Oriented Software Architecture — A System of Patterns J. Wiley & Sons, Chichester, 1996



0
0
0.000
2 comments
avatar

Du hast ein Upvote von mir bekommen, diese soll die Deutsche Community unterstützen. Wenn du mich unterstützten möchtest, dann sende mir eine Delegation. Egal wie klein die Unterstützung ist, Du hilfst damit der Community. DANKE!

0
0
0.000