Arbeiten mit .NET: Entwurfsmuster/ Behavioral Patterns/ Iterator

Dieser Buchabschnitt benötigt eine Wikifizierung. Hilfe ist erwünscht! Textbezogenen Fragen und Anmerkungen können auf der Diskussionsseite besprochen werden.

Implementierung

Bearbeiten

  C#-Code:  

using System;
using System.Collections;

namespace Org.Wikibooks.De.Csharp.Pattern.Iterator
{
 #region Implementierung des Design Patterns Iterator
 #region Beschreibung
 /*
  * Im folgenden Abschnitt befindet sich die Implementierung
  * des Iterator-Patterns, wie es in Wikibooks (Muster) definiert ist.
  * 
  * Um die Komplexität zu senken,
  * wurde das Muster minimal modifiziert.
  *
  */
 #endregion
 // Die Klasse Iterator birgt die abstrakte Implementierung
 // aller für die Traversierung benötigten Funktionen.
 abstract class Iterator
 {
   public abstract void Start();

   public abstract object GibElement();

   // Modifikation: 
   // Das Wikibook-Pattern "Iterator" verlangt hier eine Methode 
   // ohne Rückgabe. Jedoch ist die Implementierung
   // einfacher, wenn wir gleich das nächste Element
   // zurückgeben können.
   public abstract object Weiter();

   // Infolge der Modifikation wird diese Methode überflüssig.
   // Sie ist lediglich der Vollständigkeit halber implementiert.
   public abstract bool GibtWeiteres();
 }
 abstract class Sammlung
 {
   public abstract Iterator ErzeugeIterator();
 }
 class KonkreterIterator : Iterator
 {
   private KonkreteSammlung m_Sammlung;

   // Der Zeiger auf das 
   // aktuelle Objekt der Sammlung.
   private int m_Aktuell = 1;

   public KonkreterIterator(KonkreteSammlung sammlung)
   {
     m_Sammlung = sammlung;
   }

   public override void Start()
   {
     m_Aktuell = 1;
   }

   public override object GibElement()
   {
     return m_Sammlung[m_Aktuell - 1];
   }

   public override object Weiter()
   {
     object element = null;

     // Falls sich noch weitere Elemente
     // in der Sammlung befinden,
     // iterieren wir den aktuellen Positionszeiger.
     if (m_Sammlung.Anzahl > m_Aktuell)
     {
     m_Aktuell++;
     element = GibElement();
     }
     return element;
   }

   // Diese Methode ist in der aktuellen Implementierung
   // funktionslos und wurde nur der Vollständigkeit halber aufgenommen.
   public override bool GibtWeiteres()
   {
     return ((m_Aktuell < m_Sammlung.Anzahl) ? true : false);
   }
 }
 class KonkreteSammlung : Sammlung
 {
   private ArrayList m_Liste = new ArrayList();

   public override Iterator ErzeugeIterator()
   {
     return new KonkreterIterator(this);
   }

   public int Anzahl
   {
     get { return m_Liste.Count; }
   }

   public object this[int index]
   {
      get { return m_Liste[index]; }
      set { m_Liste.Insert(index, value); }
   }
 }
 #endregion

Die Verwendung des Iterators:


  C#-Code:  

 #region Verwendung des Iterators
 public class Consumer
 {
   private KonkreteSammlung m_Sammlung;

   public Consumer()
   {
     // Hier erzeugen wir die Sammlung
     m_Sammlung = new KonkreteSammlung();

     // Wir füllen die Sammlung mit Objekten.
     m_Sammlung[0] = "1. Objekt";
     m_Sammlung[1] = "2. Objekt";
     m_Sammlung[2] = "3. Objekt";
     m_Sammlung[3] = "4. Objekt";
   }

   public void Iteriere()
   {
     KonkreterIterator iterator = new KonkreterIterator(m_Sammlung);

     Console.WriteLine("Beginne Iteration über {0} Objekte:\n", m_Sammlung.Anzahl);

     // Wir setzen den Iterator auf das erste
     // Element in der Sammlung.
     iterator.Start();
     object element = iterator.GibElement();

     while (element != null)
     {
       Console.WriteLine(element);
       element = iterator.Weiter();
     }

     Console.ReadLine();
   }
 }
 #endregion
}


Ausgabe:


  Output:  

Beginne Iteration über 4 Objekte:

1. Objekt
2. Objekt
3. Objekt
4. Objekt


Wikibooks: Definition des Design Patterns: Iterator
Wikipedia: Iteration, Iterator, Iterator (Entwurfsmuster)