EMZETT.
Login

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 match oft den Besucher.
  • Bekannt aus: Compilern, Dateisystem-Durchläufen, ast.NodeVisitor in Python.

Siehe auch: Iterator-Muster