Bryan Albrecht

Visitor Pattern

Das Visitor Pattern heisst ins Deutsche übersetzt das Besucher Muster. Da das Visitor Pattern das Verhalten im Code beeinflusst, gehört es zu der Familie der Verhaltensmuster.

Nutzen

Der Nutzen dieses Pattern ist es, dass man einer Klasse eine Methode als "Besucher" hinzufügen kann, ohne diese in der Klasse definieren zu müssen. Die Methode wird in einer separaten Klasse definiert und dann der Klasse hinzugefügt.

Beispiel

Ein einfaches Beispiel für die Anwendung, wäre das berechnen von Zollkosten verschiedener Artikel. Die Artikel dienen hierbei als Klassen, welchen eine Methode zum Berechnen der Kosten hinzugefügt wird.

Visitor

Aufbau

Das Visitor Pattern erfordert zwei Interface. Das "Visitor" und das "Visitable" Interface.
Alle Klassen, welchen eine Methode als "Besucher" bekommen sollen, müssen vom "Visitable" Interface ableiten. Das "Visitor" Interface wird wiederum von der Klasse benutzt, in welcher die "Besucher" Methode ausprogrammiert wird.
Folgendes Klassendiagram baut auf dem vorherigen Beispiel auf:

Visitor UML

In diesem Klassendiagramm sind absichtlich keine Methoden und Properties abgebildet, da dies momentan nur zur Übersicht des Aufbaus dienen soll.

Implementierung

Für die Implementierung müssen die beiden Interfaces so wie alle dazugehörigen Klassen mit Methoden ausgestattet werden.

Im grün markierten Visitor Interface muss für jede Klasse, welche die "Besucher" Methode erhalten soll, eine Methode mit einem Parameter der gewünschten Klasse eingefügt werden. In diesem Beispiel sind dies die drei Methoden. Natürlich muss die Klasse, welche von "Visitor" abgleitet noch angepasst werden.

Visitor UML

Da die Klassen, welche die "Besucher" Methode erhalten sollen eine Art Platzhalten für die "Besucher" Methode brauchen wird dieser "Platzhalten" in da orange markierte Interface eingefügt.

Visitor UML

Mit Hilfe dieses Platzhalters wird die "Besucher" Methode aufgerufen. Dies sieht bei allen Klassen, welche von Visitable ableiten wie folgt aus:

  1. public class General : Visitable
  2. {
  3. public void CalculateDuties(Visitor visitor)
  4. {
  5. visitor.Calculate(this);
  6. }
  7. }

Die Umsetzung der DutiesVisitor Klasse könnte wie folgt aussehen:

  1. class DutiesVisitor : Visitor
  2. {
  3. public void Calculate(General item)
  4. {
  5. Console.WriteLine("Dutie for General articel");
  6. }
  7. public void Calculate(Art item)
  8. {
  9. Console.WriteLine("Dutie for Art articel");
  10. }
  11. public void Calculate(Food item)
  12. {
  13. Console.WriteLine("Dutie for Food articel");
  14. }
  15. }

Fazit

Durch das Umsetzen der "Besucher" Methoden in einer anderen Klasse, ist der Code um einiges wartbarer. Die Methoden, welche ähnliche Aufgaben erledigen sind somit in einer eigenen Klasse gekapselt.