Im vorliegenden Beispiel wenden wir konkrete Besucher auf elementare
geometrische Objekte, sogenannte Primitive, an. Es ist wünschenswert, daß sich
diese Grundbausteine einer Graphikanwendung während der Softwareentwicklung und
bei möglicher Wiederverwendung nicht ändern. Die auf diese Objekte wirkenden
Operationen, in diesem Fall Bewegungen, können hingegen Veränderungen
unterworfen sein. Um diese Trennung zu ermöglichen, werden die Operationen in
eine getrennte Klasse visitor ausgelagert und die Graphikobjekte mit einer
Methode zum Empfang eines solchen Besuchers versehen. Ein konkreter Besucher
kann verschiedene Objekte besuchen , die nicht notwendigerweise vom gleichen
Vorfahren abstammen.
Zur Implementation:
Die Graphikobjekte point, line
und circle stammen von der
abstrakten Klasse primitive ab, die
die gemeinsame Schnittstelle dieser Klassen definiert. Es gibt eine Methode
zeichne() zur Bildschirmausgabe und eine Methode receive() zum Empfang eines
Besuchers. Die Bewegungen movevisitor,
mirrorvisitor und
rotatevisitor stammen alle von der
abstrakten Klasse visitor ab. Jede von
ihnen implementiert konkrete Methoden zum Besuch der verschiedenen
Graphikobjekte, nämlich visitPOINT(), visitLINE() und visitCIRCLE(). Wird die
Methode receive(), die als Parameter einen visitor erwartet, eines
Graphikobjekts aufgerufen, wird die zum Objekt passende Methode des Besuchers
aufgerufen. Als Parameter dient dabei das Objekt selbst (this). Die Methode des
Besuchers kann jetzt Veränderungen am Objekt vornehmen. Dazu ist es natürlich
nötig, daß die Eigenschaften der Graphikobjekte von außen zugänglich sind, was
ein Nachteil des Musters Besucher ist.
Die Klasse Application demonstriert das
beschriebene Zusammenspiel der Klassen. Es werden Paare von zufälligen, aber
identischen Graphikobjekten erzeugt. Eines der Objekte empfängt einen
zufälliger Besucher. Dann werden beide Objekte in verschieden Listen für die
graphische Ausgabe abgelegt.
|
Abb. 1: Die Struktur des Beispiels
|
|