Java Reference
In-Depth Information
Der Aufbau einer Datenstruktur ist für die Anwendung irrelevant, solange die Anwen-
dung zum Traversieren der Datenstruktur einen Iterator benutzt. Als Symbol für alle
möglichen Datenstrukturen enthält das Klassendiagramm eine Klasse
Datenstruk-
tur
. Zum besseren Verständnis des Musters muss aber die Funktionsweise eines
Iterators gezeigt werden. Dazu wird zunächst eine sehr einfache Datenstruktur ver-
wendet. Wie im Klassendiagramm in Bild 4-56 zu sehen ist, aggregiert die Klasse
Datenstruktur
eine Menge von Elementen beispielsweise in Form eines Arrays.
Die Klasse
Element
steht hier stellvertretend für weitere Elementklassen, die von der
Klasse
Element
abgeleitet sind. Die Klasse
Element
ist somit die Basisklasse aller
Klassen, deren Objekte in der Datenstruktur vorkommen können. Diese Forderung
ergibt sich daraus, dass die Methode
next()
im Interface
IIterator
als Ergeb-
nistyp den Typ
Element
hat.
Eine Anwendung - hier Client genannt - nutzt das Interface
IIterator
. Er kann aber
dadurch auf Grund des liskovschen Substitutionsprinzips jeden konkreten Iterator nut-
zen, dessen Klasse das Interface
IIterator
implementiert und dessen Verträge ein-
hält.
Das Interface
IDatenstruktur
definiert den Kopf einer Methode
erzeugeItera-
tor()
. Diese Methode muss in jeder Datenstruktur implementiert werden und einen
zu der Datenstruktur passenden Iterator an den Aufrufer zurückliefern. Bei der Metho-
de
erzeugeIterator()
handelt es sich um eine
Fabrikmethode
(siehe Kapitel
4.18).
Die Datenstruktur selbst muss keine Methoden zum Traversieren zur Verfügung stel-
len, sondern muss nur einen passenden Iterator anbieten. Der Iterator übernimmt die
Aufgabe der Traversierung. Dadurch dass die Aufgabe der Traversierung aus der Da-
tenstruktur herausgezogen wird (
Separation of Concerns
), wird die Implementierung
der Datenstruktur vereinfacht. Wie das Klassendiagramm in Bild 4-56 zeigt, sind aller-
dings die Klasse
Datenstruktur
und die Klasse
KonkreterIterator
stark gekop-
pelt. Dafür muss der Client den Aufbau der Datenstruktur nicht kennen und muss sich
nicht mehr um die Art und Weise der Traversierung der Datenstruktur kümmern.
Wie bereits erwähnt wurde, gibt es Datenstrukturen, bei denen verschiedene Traver-
sierungsarten und damit verschiedene Iteratoren zum Einsatz kommen können. In die-
sem Falle kann die Methode
erzeugeIterator()
parametrisiert werden, damit ein
Client über den Parameter den gewünschten Iterator auswählen kann. Alternativ kann
eine Datenstruktur auch mehrere Methoden zum Erzeugen von Iteratoren zur Verfü-
gung stellen. Hierauf wird im Folgenden nicht weiter eingegangen.
4.17.3.2 Teilnehmer
IIterator
Das Interface
IIterator
definiert eine Methode
next()
zum Traversieren und zum
Zugriff auf die Elemente der Datenstruktur sowie eine Methode
hasNext()
zum Über-
prüfen der Existenz eines nächsten Elements.
Search WWH ::
Custom Search