Java Reference
In-Depth Information
Double-Dispatch muss also in Java simuliert werden. Dies geschieht dadurch, dass die
konkreten Elemente der Objektstruktur die in der Basisklasse deklarierte
akzeptie-
ren()
-Methode - wie bereits beschrieben - implementieren. Im Rumpf dieser Me-
thode rufen sie die
besuchen()
-Methode des Objektes vom Typ
Konkreter-
BesucherX
auf und übergeben hierbei eine Referenz auf sich selbst als Parameter.
Damit ist - wie gewünscht - die Auswahl der "richtigen"
besuchen()
-Methode ab-
hängig vom konkreten Besucher und dem konkreten Daten tragenden Element. Die
Technik des Double-Dispatch wird ausführlich in [Bec08] beschrieben. Die Hin- und
Her-Aufrufe kommen also durch die Simulation von Double-Dispatch in Java zustande.
Varianten im Verhalten bedingt durch unterschiedliche Objektstrukturen
Es wurde bereits mehrfach erwähnt, dass die Beschreibung des dynamischen Verhal-
tens nur schematisch erfolgen kann, solange nicht die zu besuchende Objektstruktur
konkret betrachtet wird. Bisher wurde die Objektstruktur als eigenständiges Objekt be-
trachtet, das die enthaltenen Elemente "kennt" und, wie im Bild 4-54 zu sehen ist,
dafür sorgt, dass diese Elemente besucht werden. Diese Rolle kann aber auch von
einem anderen Objekt übernommen werden - abhängig davon, wie die Objektstruktur
konkret realisiert ist. Dadurch ergeben sich verschiedene Varianten des dynamischen
Verhaltens des Besucher-Musters. Die Rolle, die in der bisherigen Beschreibung des
Musters das Objekt der Klasse
ObjektStruktur
innehatte, kann alternativ auch:
x
vom Client,
x
von einem separaten Iterator-Objekt,
x
einem Besucher-Objekt oder
x
einer Datenstruktur, die die Elemente enthält (z. B. ein Baum),
übernommen werden. Diese Fälle werden im Folgenden vorgestellt:
x
Client
Im einfachsten Fall nimmt der Client die Rolle der Objektstruktur an. Die Objekte
vom Typ
KonkretesElementY
sind einzelne, verstreute Instanzen ohne Bezug
zueinander oder befinden sich in einer einfachen Datenstruktur wie z. B. einem
Array. Der Client nimmt ein Objekt der vorhandenen Typen
KonkretesElementY
(
Y = A..Z
) nach dem anderen und sorgt dafür, dass es besucht wird, indem er
jeweils die
akzeptieren()
-Methode dieses Objekts aufruft und dabei das Objekt
vom Typ
KonkreterBesucherX
übergibt.
x
Separates Iterator-Objekt
Wenn die Elemente der Objektstruktur gekapselt sind und die Objektstruktur ein
Iterator-Objekt zum Zugriff auf die Elemente anbietet, so wird das Iterator-Objekt
vom Client benutzt, um über die Menge der Objekte der vorhandenen Typen
KonkretesElementY
(
Y = A..Z
) zu iterieren. Der Client ruft dabei die
akzeptieren()
-Methode jedes Objekts auf, auf das er vom Iterator-Objekt eine
Referenz bekommt und übergibt hierbei das Objekt vom Typ
Konkreter-
BesucherX
. Die Reihenfolge der Besuche wird durch die Reihenfolge bestimmt, in
der das Iterator-Objekt die einzelnen Referenzen liefert.
Search WWH ::
Custom Search