Iterator (Entwurfsmuster)

Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 29. September 2004 um 15:28 Uhr durch 195.124.114.30 (Diskussion). Sie kann sich erheblich von der aktuellen Version unterscheiden.

Mit dem Begriff Iterator bezeichnet man ein Entwurfsmuster (Design Pattern) für die Softwareentwicklung.

Zweck

Ermöglicht den Zugriff auf die Elemente einer Sammlung ohne Kenntnis der Struktur der Sammlung.

Andere Bezeichnungen

Cursor

Motivation

Die Zusammenfassung von Objekten zu einer Sammlung/Menge/Liste ist ein in der Programmierung von Softwaresystemen häufig auftretender Vorgang. Sich möglichst generisch und ohne Rücksicht auf die Details der Implementierung der Sammlung/Menge/Liste Zugriff auf die Elemente zu verschaffen ein naheliegendes Anliegen.

Beispiel

Ein einfacher Fall eines externen Iterators wäre etwa:

 class ObjectIterator
 {
   private Object[] m_source;
   private int m_current;
public ObjectIterator(Object[] source) { m_source = source; }
public boolean hasNext() { return m_current < m_source.length; }
public Object next() { return m_source[m_current++]; } }

Anwendung:

 Object[] myList = new Object[] {new Integer(1), new Integer(2), new Integer(3)};
 ObjectIterator iterator = new ObjectIterator(myList);
 while(iterator.hasNext())
 {
   System.out.println(iterator.next());
 }

Eine andere Variation dieses Entwurfsmusters wäre ein interner Iterator:

 class MyObjectIterator extends ObjectIterator
 {  
   public MyObjectIterator(Object[] source)
   {
     super(source);
   }
public void print() { while(hasNext()) { System.out.println(next()); } }
public void apply(ObjectHandler handler) { while(hasNext()) { handler.handle(next()); } } }
Interface ObjectHandler { public void handle(Object o); }

Anwendung:

 class MyObjectHandler implements ObjectHandler
 {
   public void handle(Object o)
   {
     System.out.println(o);
   }
 }
Object[] myList = new Object[] {new Integer(1), new Integer(2), new Integer(3)}; MyObjectIterator iterator = new MyObjectIterator(myList); iterator.print(); iterator.apply(new MyObjectHandler());

Ein interner Iterator kapselt die Iteration selber und macht sie so im gesamten Programm einfach und konsistent wiederverwendbar, ohne sie wie im Fall eines externen Iterators immer wieder neu programmieren zu müssen. Durch Anwendung des Strategie Entwurfsmusters lässt sich der Algorithmus auch einfach austauschen, wie in der letzten Beispielzeile gezeigt.

Obwohl sich diese Beispiele mit sequentiellem Zugriff begnügen, sind natürlich auch Iteratoren mit wahlfreiem Zugriff möglich. Viele Implementierungen bieten zusätzlich die Möglichkeit die iterierte Sammlung direkt zu verändern, etwa durch Entfernen des aktuellen Elementes.