Iteratormodus, auch als Cursormodus bekannt. Die von GOF angegebene Definition besteht darin, eine Methode zum Zugriff auf verschiedene Elemente in einem Containerobjekt bereitzustellen, ohne die internen Details des Objekts freizulegen.
Das Iteratormuster besteht aus den folgenden Rollen:
Iteratorrolle: Die Iteratorrolle ist für die Definition der Schnittstelle zum Zugriff auf und durch Traverse -Elemente verantwortlich.
Konkrete Iteratorrolle: Die spezifische Iteratorrolle muss die Iteratorschnittstelle implementieren und den aktuellen Standort im Traversal aufzeichnen.
Container: Die Containerrolle ist für die Bereitstellung einer Schnittstelle verantwortlich, um eine bestimmte Iteratorrolle zu erstellen.
Betonbehälter: Die spezifische Containerrolle implementiert die Schnittstelle, um eine spezifische Iteratorrolle zu erstellen. Diese spezifische Iteratorrolle hängt mit der Struktur des Behälters zusammen.
Beispiel für Java -Implementierung
Klassendiagramm:
Code:
/ ** * benutzerdefinierte Sammlungsschnittstelle, ähnlich wie java.util.collection * für Datenspeicher * @author stone * */ public interface icollection <T> {Iiterator <T> iterator (); // die iterator void add (t t) zurückgeben; T GET (INT INDEX); } / ** * Benutzerdefinierte Iterator -Schnittstelle ähnelt Java.util.iterator * Daten, mit denen die Sammlungsklasse iCollection * @author stone * */ public interface iiterator <t> {boolean hasNext () verwendet wird; boolean Hasprevious (); T als nächstes (); T vorher (); } / ** * Sammlungsklasse, abhängig von Myiterator * @Author Stone */ Public Class MyCollection <T> implementiert iCollection <T> {private t [] arys; private int index = -1; Private int -Kapazität = 5; public myCollection () {this.arys = (t []) neues Objekt [Kapazität]; } @Override public iiterator <t> iterator () {return New Myiterator <T> (this); } @Override public void add (t t) {index ++; if (index == Kapazität) {Kapazität *= 2; this.arys = arrays.copyof (arys, Kapazität); } this.arys [index] = t; } @Override public t Get (int Index) {return this.arys [index]; }} /** Wenn es eine neue Speicherstruktur gibt, können Sie eine neue iCollection, die dem neuen Iiterator entspricht, um seine Traversal zu implementieren. add (Sammlung, 3, 5, 8, 12, 3, 3, 5); für (Iiterator <Geuner> iterator = collection.iterator (); iterator.hasnext ();) {System.out.println (iterator.next ()); } System.out.println ("--------------------------"); Icollection collection2 = new MyCollection (); add (collection2, "a", "b", "c", 3, 8, 12, 3, 5); für (iiterator iterator = collection2.Iterator (); iterator.hasnext ();) {System.out.println (iterator.next ()); }} static <T> void add (iCollection <t> c, t ... a) {für (t i: a) {c.add (i); }}}}Drucken:
3 5 8 12 3 3 5 ------------------ ABC 3 8 12 3 5