Besucher-Muster (Visitor)
Kurz: Das Visitor-Muster trennt eine Operation von der Objektstruktur, auf der sie arbeitet, sodass man neue Operationen ergänzen kann, ohne die Klassen zu ändern.
Genauer: Jedes Element bietet eine Methode accept(visitor) an und ruft darin visitor.visit(this) auf. Der Besucher enthält je Elementtyp den passenden Code („Double Dispatch”).
Im Detail
- Typisches Beispiel: Ein Syntaxbaum aus Knoten wie Zahl, Addition, Variable. Besucher sind „auswerten”, „ausgeben”, „optimieren”.
- Vorteil: Neue Operation = neue Besucher-Klasse, ohne die Knotenklassen anzufassen.
- Nachteil: Neue Knotentypen zwingen alle Besucher zur Änderung. Das Muster lohnt sich, wenn sich Operationen häufiger ändern als Typen.
- Alternativen: In Sprachen mit Pattern Matching über Summentypen (Rust, Kotlin, TypeScript, moderne Java-Versionen) ersetzt ein
matchoft den Besucher. - Bekannt aus: Compilern, Dateisystem-Durchläufen,
ast.NodeVisitorin Python.
Siehe auch: Iterator-Muster