Klassifizierung |
objektbasiertes Verhaltensmuster
|
| |
Zweck |
sequentieller Zugriff auf die Komponenten
eines zusammengesetzten Objekts,
ohne die innerer Struktur des Objekts offenzulegen
|
| |
Alias |
Cursor
|
| |
Motivation |
in Container-Klassen alle Elemente verarbeiten
|
|
Schleife über alle Elemente eines Containers
Schleife immer gleich, also als Schablonenmethode
in einer gemeinsamen Oberklasse für alle Container implementieren
|
|
nur die Aufzählung aller Elemente in jeder Realisierung neu
|
| |
Beispiel |
|
| |
Anwendbarkeit |
|
|
Zugriff auf die Elemente eines Containers
(allgemein: eines zusammengesetzten Objekts)
ohne die Struktur des Containers offen zu legen
|
|
geschachtelte Iteration über den gleichen Container
|
|
einheitliche Schnittstelle zum Aufzählen von Objekten
|
|
ineffizient, wenn das zusammengesetzte Objekt rekursiv definiert ist,
und eine Baumstruktur besitzt
|
|
|
|
|
| |
Struktur |
Strukturdiagramm
|
| |
Teilnehmer |
|
Container |
abstrakte Klasse für alle Container
|
Enumeration |
abstrakte Klasse für die Aufzählung, die Iterator-Schnittstelle
|
Container1 |
eine konkrete Implementierung eines Containers
implementiert Iterator-Erzeugungsfunktion(en)
|
Enumeration1 |
die zu dem Container gehörige Iteratorklasse
|
| |
Konsequenzen |
|
|
viele Container-Operationen können
allgemein für alle Container gemeinsam formuliert werden
|
|
|
|
die erzeugenden Funktionen für die Aufzählungen sind der
einzige variable Teil in den Schablonenmethoden
|
|
für die Iteratoren werden zusätzliche Objekte benötigt
Effizienz?
|
|
mit foreach-Routinen manchmal eleganter und
effizienter
keine zusätzlichen Objekte für den Iterator-Zustand
|
|
der Zustand im Iterator-Objekt ist nicht immer einfach zu verwalten
Beispiel: binärer Baum
der gesamte Pfad vom momentanen Knoten zur Wurzel zurück muss
im Iterator verwaltet werden.
|
|
|
|
Vorsicht: keine Änderung des Containers während der Iteration
|
| |
|
|
| |
Implementierung |
|
|
die Iteratoren lesen nur im Container
|
|
deshalb mehrere Iteratoren auf einem Container möglich
|
|
in der Literatur: stabile Iteratoren
Iteratoren, die auch noch "richtig" arbeiten, wenn der Container
während der Iteration verändert wird
besser: nicht verwenden und nicht implementieren
|
|
Schnittstelle für die Iteratoren unterschiedlich breit
eine bis fünf Funktionen
Java: eine sehr einfache Schnittstelle
|
| |
Beispiele |
|
| |
Bekannte Verwendungen |
JDK1.1 java.util.Enumeration Klasse
|
| |
verwandte Muster |
|
|
sind für rekursive Datenstrukturen
besser geeignet als Iteratoren
im Entwurfsmuster-Buch: Einschätzung falsch
|
| |
|
foreach-Routinen mit Kommandos
als Parameter sind effizienter
|
| |