prev up next

Previous: down routing Up: Implementation Next: Arbeitsgruppe Renderer

Visitor

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.


down routing. 1.: Ein Vaterknoten ruft routeDown bei einem Kind mit dem passenden Visitor auf. 2.: Das Group-Kind ruft beim Visitor select mit der Klasse seines 1. Kindes ( Shape3D) auf. 3.: Der Visitor liefert den für das 1. Kind passenden Visitor und das Group-Kind ruft mit diesem dann routeDown bei seinem 1. Kind auf (4.). 5.: Schritt 2., 3. und 4. werden für alle weiteren Kinder wiederholt. Dann ruft das Group-Kind bei dem für ihn passenden Visitor visit auf und das Ergebnis dieser Methode wird über das Group-Kind (hier nicht gezeichnet) an den Vater zurückgeliefert (6.).

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).


prev up next
Previous: down routing Up: Implementation Next: Arbeitsgruppe Renderer