Die eigentliche Arbeit beim down routing muß von jemand anderem als
den einzelnen Knoten erledigt werden. Dieses Problem wird mit dem
Visitor gelöst.
Ein Visitor ist ein Objekt, das einen Knoten des Szenengraphen
besucht.
Jeder Visitor ist auf Besuche bzgl. eines bestimmten Eventtyps bei Knoten
einer bestimmten Klasse spezialisiert. Alle Visitoren, die auf
Besuche bzgl. desselben Eventtyps spezialisiert sind, werden in einem
VisitorPool zusammengefaßt. D.h. es gibt z.B. einen Pool mit
Vistoren, die einen Knoten auf die für
addChild-Events typische Art und Weise besuchen. Dieser Pool heißt
AddChildVisitors. Ein anderer Pool (z.B. RemoveChildVisitors)
enthält nur Visitoren, die jeden Knoten bzgl.
removeChild-Events besuchen. Jeder Visitor kennt seinen Pool und alle
Pools sind der Laufzeitumgebung bekannt.
Wenn ein Handler ein Event eines bestimmten Typs bearbeiten soll und dazu
zumindest einen Teil des Graphen traversieren muß, so ruft er bei der
Laufzeitumgebung die Methode getVisitorForProblem mit dem Eventtyp
(z.B. addChild) als Argument auf und erhält einen beliebigen Visitor
aus dem entsprechenden Pool zurück. Der Handler ruft dann bei diesem
Visitor die Methode select mit der Klasse des Wurzelknotens des zu
traversierenden Teilgraphen (z.B. Group) als Argument auf und
erhält denjenigen Visitor zurück, der auf Besuche bei dieser Knotenklasse
spezialisiert ist.
Diesen Visitor übergibt der Handler dem Wurzelknoten anschließend beim
Start des down routings im Aufruf der Methode _routeDown. Außerdem
übergibt der Handler noch die Laufzeitumgebung, damit die Visitoren
ggf. Informationen an diese weitergeben können.
In der Methode _routeDown werden zunächst die
_routeDown-Methoden aller Kinder des Knotens aufgerufen. Sie bekommen als
Argumente einen Visitor, der für die Kindklasse spezialisiert ist (man
verschafft sich diesen, indem man select beim aktuellen Visitor mit
der Kindklasse aufruft) und wiederum die Laufzeitumgebung.
Danach wird der aktuelle Visitor gebeten diesen Knoten zu besuchen.
Der Besuch wird durch Aufruf der Methode visit des Visitors
ausgelöst. Die Methode bekommt den zu besuchenden Knoten, das Ergebnis der
Besuche bei den Kindern dieses Knotens (sofern vorhanden)
und als Kontext die Laufzeitumgebung
in der Argumentliste übergeben. visit liefert als Ergebnis des Besuchs
ein Objekt zurück, das die Informationen über diesen Knoten und dessen Kinder
in der für den Zweck des Besuchs typischen Weise enthält.
Dieses Objekt wird am Ende von _routeDown als Ergebnis an den Vater
des Knotens zurückgeliefert (s. Abbildung 2.6).