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
  | 
  |  |