Iterator-Muster

Das Iterator-Muster ist ein sehr häufig verwendetes Entwurfsmuster in Java- und .Net-Programmierumgebungen.

Das Iterator-Muster bietet eine Möglichkeit, sequenziell auf die Elemente eines Aggregatobjekts zuzugreifen, ohne dessen interne Repräsentation offenzulegen.

Das Iterator-Muster ist ein Verhaltensmuster.

Einführung

Absicht

Ermöglicht den sequenziellen Zugriff auf Elemente in einem Aggregatobjekt, ohne die interne Repräsentation des Objekts offenzulegen.

Wesentliche gelöste Probleme

  • Bietet eine einheitliche Methode zum Durchlaufen verschiedener Aggregatobjekte.

Anwendungsfall

  • Wenn Sie ein Aggregatobjekt durchlaufen müssen, ohne dessen interne Struktur offenzulegen.

Implementierungsansatz

  • Definieren Sie die Iterator-Schnittstelle: enthälthasNext()undnext()und andere Methoden, die zum Durchlaufen von Elementen verwendet werden.
  • Erstellen Sie einen konkreten Iterator: Implementiert die Iterator-Schnittstelle und definiert, wie ein bestimmtes Aggregatobjekt durchlaufen wird.
  • Aggregatklasse: Definiert eine Schnittstelle zum Zurückgeben eines Iteratorobjekts.

Schlüsselcode

  • Iterator-Schnittstelle: Legt die Methoden zum Durchlaufen von Elementen fest.
  • Konkreter Iterator: Implementiert die Iterator-Schnittstelle und enthält die Traversierungslogik.

Anwendungsbeispiel

  • Iterator in Java: Iteratoren im Java Collections Framework werden verwendet, um Sammlungselemente zu durchlaufen.

Vorteile

  1. Unterstützt mehrere Traversierungsmethoden.: Verschiedene Iteratoren können unterschiedliche Traversierungsmethoden definieren.
  2. Aggregatklasse vereinfachen: Die Aggregatklasse muss sich nicht um die Traversierungslogik kümmern.
  3. Unterstützung mehrerer Traversierungen: Mehrere Traversierungen können gleichzeitig auf demselben Aggregatobjekt durchgeführt werden.
  4. Erweiterbarkeit: Das Hinzufügen neuer Aggregatklassen und Iteratorklassen ist sehr bequem, ohne vorhandenen Code zu ändern.

Nachteile

  • Systemkomplexität: Jedes Mal, wenn eine Aggregatklasse hinzugefügt wird, muss eine entsprechende Iteratorklasse hinzugefügt werden, was die Anzahl der Klassen erhöht.

Verwendungshinweise

  • Wenn Sie auf den Inhalt eines Aggregatobjekts zugreifen müssen, ohne dessen interne Repräsentation offenzulegen, verwenden Sie das Iterator-Muster.
  • Wenn Sie mehrere Traversierungsmethoden für ein Aggregatobjekt bereitstellen müssen, sollten Sie das Iterator-Muster in Betracht ziehen.

Hinweise

  • Das Iterator-Muster trennt das Traversierungsverhalten von Sammlungsobjekten, sodass externer Code transparent auf die internen Daten der Sammlung zugreifen kann, ohne deren interne Struktur offenzulegen.

Struktur

Das Iterator-Muster umfasst die folgenden Hauptrollen:

  • Iterator-Schnittstelle (Iterator): Definiert Methoden für den Zugriff auf und das Durchlaufen jedes Elements in einem Aggregatobjekt, typischerweise einschließlich des Abrufens des nächsten Elements, der Prüfung, ob weitere Elemente vorhanden sind, des Abrufens der aktuellen Position und anderer Methoden.

  • Konkreter Iterator (Concrete Iterator): Implementiert die Iterator-Schnittstelle und ist für das Durchlaufen und den Zugriff auf das Aggregatobjekt verantwortlich, während er die aktuelle Durchlaufposition aufzeichnet.

  • Aggregat-Schnittstelle (Aggregate): Definiert eine Schnittstelle zum Erstellen von Iterator-Objekten, typischerweise einschließlich einer Fabrikmethode zum Erstellen von Iterator-Objekten.

  • Konkretes Aggregat (Concrete Aggregate): Implementiert die Aggregat-Schnittstelle und ist für das Erstellen konkreter Iterator-Objekte sowie für die Bereitstellung der zu durchlaufenden Daten verantwortlich.

Implementierung

Wir werden eine Schnittstelle erstellen, die Navigationsmethoden beschreibt.Iterator-Schnittstelle und eine Schnittstelle, die einen Iterator zurückgibt.Container-Schnittstelle. ImplementiertContainerKonkrete Klassen der Schnittstelle werden für die Implementierung verantwortlich sein.Iterator-Schnittstelle.

IteratorPatternDemo, unsere Demonstrationsklasse verwendet die konkrete Klasse.NamesRepositoryZum Ausgeben vonNamesRepositoryals Sammlung gespeichert inNames。

迭代器模式的 UML 图

Schritt 1

Schnittstelle erstellen:

Iterator.java

public interface Iterator { public boolean hasNext(); public Object next(); }

Container.java

public get Container { Iterator Iterator get(); }

Schritt 2

ImplementierekonkreteKlasseNameInner class of the interfaceNameIterator。

NameRepository.java

class NameRepository implements Container Container { public String[] names = {"Robert" , "John" ,"Julie" , "Lora"}; @Override public Iterator getIterator() { return new NameIterator(); } private class NameIterator implements Iterator { int index; @Override public boolean hasNext() { if(index < names.length){ return true; } return false; } @Override public Object next() { if(this.hasNext()){ return names[index++]; } return null; } } }

Schritt 3

VerwendungNameRepositoryum den Iterator zu erhalten und Namen auszugeben.

IteratorPatternDemo.java

public class IteratorPatternDemo { public static void main(String[] args) { NameRepository namesRepository = new NameRepository(); for(Iterator iter = namesRepository.getIterator(); iter.hasNext();){ String name = (String)iter.next(); System.out.println("Name : " + name); } } }

Schritt 4

Führen Sie das Programm aus, geben Sie die Ergebnisse aus:

Name : Robert
Name : John
Name : Julie
Name : Lora
Weitere Erweiterungen