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ält
hasNext()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
- Unterstützt mehrere Traversierungsmethoden.: Verschiedene Iteratoren können unterschiedliche Traversierungsmethoden definieren.
- Aggregatklasse vereinfachen: Die Aggregatklasse muss sich nicht um die Traversierungslogik kümmern.
- Unterstützung mehrerer Traversierungen: Mehrere Traversierungen können gleichzeitig auf demselben Aggregatobjekt durchgeführt werden.
- 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。
Schritt 1
Schnittstelle erstellen:
Iterator.java
Container.java
Schritt 2
ImplementierekonkreteKlasseNameInner class of the interfaceNameIterator。
NameRepository.java
Schritt 3
VerwendungNameRepositoryum den Iterator zu erhalten und Namen auszugeben.
IteratorPatternDemo.java
Schritt 4
Führen Sie das Programm aus, geben Sie die Ergebnisse aus:
Name : Robert Name : John Name : Julie Name : LoraWeitere Erweiterungen