Archiv für April 2016

Idee des Patterns

Die Idee des Patterns ist es, dass Besuchs-Objekte zu besuchende Objekte „besuchen”. Dabei hängen normalerweise die zu besuchenden Objekte miteinander verknüpft im Speicher, so dass sie traversiert werden können. Ein Besuch sieht so aus, dass eine accept()-Methode auf dem zu besuchenden Objekt aufgerufen wird, in deren Übergabewerten das Besuchs-Objekt selbst übergeben wird. Das zu besuchende Objekt ruft dann mit sich selbst als Parameter eine visit()-Methode im Besuchs-Objekt auf. In dieser Methode findet dann erst die eigentliche Logik eines Algorithmusses statt. Es findet also ein doppelter Aufruf statt.

Dieser doppelte Aufruf ist in folgendem Sequenzdiagramm dargestellt:

Sequenzdiagramm des Visitor Patterns, welches den Double Dispatch darstellt

Das Visitorpattern kommt häufig im Compilerbau zur Anwendung. Hier wird ein AST des Programmes aufgebaut, welcher eine Baumstruktur des zu kompilierenden Programmes im Speicher darstellt. Dieser Baum kann dann mit Hilfe des Visitor-Patterns traversiert werden. Dabei stellen die Elemente des ASTs die zu besuchenden Objekte dar. Die Besucher implementieren Algorithmen, die Informationen des ASTs verarbeiten.

Allgemeines Klassendiagramm des Patterns

visitorpatternKlassendiagramm

Vorteile des Patterns

Zunächst mag der doppelte Aufruf so aussehen, als ob durch das Visitor Pattern nur zusätzliche Komplexität in das Programm gebracht wird. Durch das Visitor-Pattern ist es jedoch möglich den Code für das Traversieren der Objektstruktur (beispielsweise des AST-Baumes) innerhalb der zu besuchenden Objekte unterzubringen, während die eigentliche Logik des Algorithmusses in die Besuchern eingebettet wird. Das Visitor-Pattern geht davon aus, dass sich die besuchten Objekte selten ändern, es jedoch relativ viele Änderungen in der Logik der Besucher gibt. Dementsprechend muss der Quellcode der zu besuchenden Objekte bei Änderungen in den Algorithmen nicht geändert werden, sondern dieser Code befindet sich innerhalb der Besucher. Der Code des Algorithmusses ist weiterhin nicht verteilt über alle zu besuchenden Objekte untergebracht, sondern befindet sich an einem Ort innerhalb der Besucher-Klasse.