Die Struktur des Iteratormusters:
Das iterative Submuster kann auf ein aggregiertes Element nacheinander zugreifen, ohne die aggregierte interne Darstellung zu entlarven.
Iterative können in externe Iterative und interne Iterative unterteilt werden.
EXTERNAL ITERATOR: Geeignet für White Box Aggregation (White Box Aggregation soll der Außenwelt eine Aggregation zur Verfügung stellen, die auf die interne Element -Schnittstelle zugreift). Da die iterative Logik vom Aggregationsobjekt selbst bereitgestellt wird, behält eine solche externe Iterator-Unterrolle häufig nur die Cursorposition des Iterativen bei. Daher ist die spezifische iterative Unterrolle eine externe Klasse, und sein Konstruktor akzeptiert ein bestimmtes Aggregatobjekt, sodass sie die iterative Logik des Aggregatsobjekts aufrufen kann.
Innerer Iterator: Geeignet für die Schwarz -Box -Aggregation (Black Box -Aggregation bietet keine Schnittstelle nach außen, um ihre eigenen Elementobjekte zu durchqueren). Da Elementobjekte, die von Black Box gesammelt werden, nur von den aggregierten internen Mitgliedern zugegriffen werden können, kann der innere Iterator nur eine Unterklasse des Mitglieds im Aggregat sein.
Einfache Demonstration:
Paket test.edu.inter; public interface iteratorobj { / *** zum ersten Element* / public void first (); / *** wechseln Sie zum nächsten Element*/ public boolean hasNextItem (); / *** das aktuelle Element zurückgeben*/ öffentliches Objekt currentItem (); } package test.edu.inter; public interface Dataset {public iteratorobj getiterator (); } package test.edu.inter; public class iterator1 implementiert iteratorobj {private dataObj set; private intgröße; private int index = 0; public iterator1 (dataObj set) {this.set = set; this.size = set.getSize (); } @Override public void first () {// Todo automatisch generierte Methode Stub this.index = 0; } @Override public boolean hasNextItem () {if (index <size) {return true; } return false; } @Override public Object currentItem () {Object ob = set.getItem (index); if (index <size) {index ++; } return OB; }} paket test.edu.inter; öffentliche Klasse DataObj implementiert Dataset {private object [] objarray = null; / *** eingehendes Aggregatobjekt*/ public dataObj (Object [] objarray) {this.objarray = objarray; } @Override public iteratorobj getiterator () {return New Iterator1 (this); } public Object getItem (int index) {return objarray [index]; } public int getSize () {return objarray.length; }} paket test.edu.inter; öffentliche Klasse Client { / ** * @param args * / public static void main (String [] args) {// Todo automatisch generierte Methode Stub String [] str = {"12312", "Dasda", "Dasd", "12d", "Asd"}; DataObj ao = new DataObj (STR); Iteratorobj io = ao.getIterator (); while (io.hasnextItem ()) {System.out.println (io.currentItem ()); }}} Auslaufergebnisse:
12312 DASDA DASD 12d ASD
Inhaltserweiterung: Anwendungen in der Java -Aggregation
Die Fabrikmethode Iterator () wird in der Schnittstelle java.util.collection bereitgestellt, um ein Iterator -Objekt zurückzugeben. Der Subtyp der Sammlungsschnittstelle implementiert die ITR der inneren Mitgliedsklasse die Iterator -Schnittstelle. Daher ist ITR eine intrinsische iterative Unterklasse, aber die AbstractList bietet auch eine eigene Traversal -Methode, daher handelt es sich nicht um eine schwarze Box -Aggregation, sondern eine weiße Box -Aggregation. Der Code ist wie folgt:
Java.util.iterator; öffentliche Schnittstelle ITR erweitert Iterator {// Indikator, die beim Aufrufen der nächsten () -Methode erneut int Cursor = 0 verwendet wird; // Indikator, die im letzten Anruf Lastret = -1 verwendet wird; int erwartModcount = modcount; public boolean hasNext () {return cursor! = size (); } öffentliches Objekt next () {try {Object next = get (cursor); checkforComodification (); Lastret = Cursor ++; Als nächstes zurückkehren; } catch (indexoutOfBoundSexception e) {checkforComodification (); neue NoSuchelementException () werfen; }} // Löschen Sie das letzte durchquerte Element, die Methode remove () kann nur das zuletzt durchträgte Element public void remove () {if (lastret ==-1) neue illegaleStateException () werfen; checkforComodification (); try {AbstractList.this.Remove (Lastret); if (lastret <cursor) cursor--; Lastret = -1; erweitertModcount = modcount; } catch (indexoutOfboundSexception e) {neue ConcurrentModificationException (); }} public void checkforComodification () {if (modcount! = erwartungsModcount) werfen neue ConcurrentModificationException (); }} Die Variablen und Methoden wie ModCount, GET (Cursor) sind alle der AbstractList -Klasse gehören, und ITR kann direkt verwendet werden. Die Methode CheckforComodification () prüft, ob der aggregierte Inhalt gerade von der Außenwelt direkt geändert wurde (nicht durch die vom Iterator bereitgestellte REME () -Methode geändert). Wenn der gesammelte Inhalt durch das iterative Sub-Objekt umgangen wird und das neue Jahr nach dem iterativen Sub-Objekt direkt modifiziert wird, wird diese Methode sofort eine Ausnahme ausgeben.
Zusätzlich: Die AbstractList -Klasse bietet auch die Methode ListItIterator () und gibt eine Klassenlisten -Instanz zurück, die die ListIterator -Schnittstelle implementiert. Die ListIterator -Schnittstelle implementiert die Vorwärts -Iteration und umgekehrte Iteration und bietet auch eine Methode, um den Inhalt der Spalte während des Iterationsprozesses sicher zu ändern.
Der Unterschied zwischen Aufzählung und Iterator: (1) Aufzählung hat keine Entlistungsmethode (2) Aufzählung wird als unbenannte Klasse im Element () -Methode im Vektor implementiert. Es zahlt sich nicht schnell aus, dh während des Iterationsprozesses wird das aggregierte Objekt unerwartet von der Außenwelt verändert, und dieser Iterationsprozess wird sofort Ausnahmen erfassen.
Das Obige dreht sich alles um diesen Artikel, ich hoffe, es wird für das Lernen aller hilfreich sein.