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)