Gegeben ist eine ArrayList a0, deren Einträge wiederum ArrayLists sind, die Objekte vom Typ String enthalten. Es sollen nun alle diese String-Objekte durchlaufen werden.
Benötigt wird ein Compound-Iterator mit einem Basisiterator, der die ArrayList a0 durchläuft und mit einem Subiterator, der die einzelnen ArrayLists durchläft, die als Einträge der Haupt-ArrayList a0 auftreten. Ferner wird eine Funktion composeItems benötigt, um aus den Cursor-Objekten der beiden Iteratoren ein Objekt zu machen, das mit next() zurückgegeben wird. In diesem Beispiel wird nur das Cursor-Objekt des Subiterators zurückgegeben.
Diese Funktionalität wird in einem Behavior NestedArrayLists spezifiziert, das dem Compound-Iterator übergeben wird.
Das Behavior NestedArrayLists erzeugt einen Compound-Iterator, der eine ArrayList von ArrayLists mit Einträgen vom Typ Type durchläuft. Im Konstruktor wird der Klasse die zu durchlaufende Haupt-ArrayList übergeben. Es folgen dann die drei Methoden, die in der abstrakten Basisklasse CompoundIteratorBehavior festgelegt sind.
In der Methode baseIterator wird der Basisiterator angegeben, der die Haupt-ArrayList durchläuft, und in der Methode subIterator der jeweilige Subiterator, hier in Abhängigkeit von dem aktuellen Eintrag der Haupt-ArrayList. Die Methode composeItems verwendet hier nur den Eintrag der Unter-ArrayList.
Die erwähnte Factory-Methode, die den fertigen Iterator zurückgibt, befindet sich in der Basisklasse CompoundIteratorBehavior.
Die folgende Main-Funktion in der Klasse TestNestedArrayLists testet den Compound-Iterator für NestedArrayLists.
Die konkret benötigte Funktionalität eines Compound-Iterators wird in einem Behavior (hier NestedArrayLists) festgelegt. Dies geschieht dort durch Angabe eines Basisiterators, eines Subiterators und der Funktion composeItems.
Zugrunde gelegt werden dabei getestete Implementierungen der Klassen Compound-Iterator und Compound-IteratorBehavior.
Für das angegebene sehr einfache Beispiel lohnt sich der Aufwand, einen Compound-Iterator zu benutzen, vielleicht nicht. Dadurch aber, dass der Compound-Iterator selbst das Iterator-Interface implementiert, kann er überall eingesetzt werden, wo ein Iterator stehen kann, also z.B. als Basisiterator in einem Filteriterator oder als Subiterator in einem anderen Compound-Iterator.
Weiter mit: [Implementierung CompoundIterator] [up]