Klassifizierung |
objektbasiertes Verhaltensmuster
|
| |
Zweck |
|
|
Verzweigen über die Klassenhierarchien
von 2 Argumenten
"double dispatch"
|
|
Entkoppeln der Verarbeitungsschritte von den
Traversierungsschritten bei
einer zusammengesetzten Struktur
--> Kompositum
|
| |
Alias |
Visitor
|
| |
Motivation |
gegeben: eine Baumstruktur
Ziel: die Knoten dieser Struktur auf unterschiedliche
Arten verarbeiten
|
| |
Beispiel |
DOM Baum eines XML/HTML Dokuments
|
|
als abstrakter Syntaxbaum ausgeben
|
|
Text extrahieren
|
|
Attribute überprüfen
|
|
transformieren
|
|
...
|
| |
Anwendbarkeit |
|
|
viele unterschiedliche Objekte einer
Hierarchie verarbeiten
|
|
UND
|
|
viele unterschiedliche Operationen
auf einer Objektstruktur ausführen
|
|
zum Bündeln der Methoden eines Verarbeitungsprozesses
in einer Klasse
|
|
Objektstruktur über die Lebensdauer eines
Programms fest
Verarbeitungsarten aber variabel
|
|
wenn alle Objekte eines Kompositums verarbeitet
werden sollen
nicht: gezieltes Selektieren
|
| |
Struktur |
Strukturdiagramm
|
| |
Teilnehmer |
|
Element |
abstrakte Klasse der zu
verarbeitenden Objekte
|
Element[A-B] |
konkrete Klassen
für die verschiedenen Ausprägungen
rufen jede eine Spezialmethode von Prozess
auf für die spezielle Ausprägung
|
Prozess |
die Besucher-Schnittstelle der Verarbeitungsprozesse
enthält für jede Element-Klasse eine
Methode
|
|
neue Elementklasse
--> Prozess-Schnittstelle erweitern
|
Prozess[1-2] |
konkrete Verarbeitungsprozesse
|
| |
Konsequenzen |
|
|
Erweiterung um
neue Operationen auf der komplexen Struktur
einfach
|
|
logisch zusammenhängende Operationen
stehen gebündelt in einer Besucher-Klasse
|
|
Erweitern um neue Element-Klassen schwer
alle konkreten Besucher müssen erweitert werden
|
|
Besucher-Hierarchien mit default-Implementierungen
erleichtern die Erweiterbarkeit
|
|
in den Besucher-Objekten kann Zustandsinformation
angesammelt werden
Vorsicht bei Rekursion, wenn diese Zustandsinformation
nicht global gültig ist
|
|
Besucher müssen auf die Daten der einzelnen
Varianten (schnell) zugreifen können
--> Kapselung aufbrechen.
|
| |
Beispiele |
|
|
|
|
|
|
|
| |
Bekannte Verwendungen |
Traversierung von Komposita
aus C: Abstraktion mit Funktionen für binäre Bäume
|
| |
verwandte Muster |
|
|
Datenstrukturen
können mit Besuchern einfach verarbeitet werden
|
| |
|
ist eine Vereinfachung
es gibt es nur eine Art
zu verarbeitender Objekte, also nur eine Methode
in der Kommando-Klasse
|
| |