Arbeiten mit .NET: Entwurfsmuster/ Behavioral Patterns/ Iterator
Erscheinungsbild
Dieser Buchabschnitt benötigt eine Wikifizierung. Hilfe ist erwünscht! Textbezogenen Fragen und Anmerkungen können auf der Diskussionsseite besprochen werden.
Implementierung
[Bearbeiten]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:
#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:
Quellen
[Bearbeiten]Wikibooks: Definition des Design Patterns: Iterator
Wikipedia: Iteration, Iterator, Iterator (Entwurfsmuster)