Visito/Besucher Design-Pattern/Strukturmuster

MatheStein

Aktives Mitglied
Hey Leute,

versuche gerade den Sinn hinter dem Visito/Besucher Design-Pattern/Strukturmuster zu verstehen.
Betrachtet man Beispielsweise den zugehörigen Wiki-Artiklen, dann kann ich die Unklarheit zunächst am besten an dem angegebenen Beispiel erläutern:

Visitor ? Wikipedia


Ich finde Beispielsweise bei dem "PrintVisitor"

Java:
class PrintVisitor implements Visitor {
 
    public void visit(Wheel wheel) {      
        System.out.println("Visiting "+ wheel.getName()
                            + " wheel");
    }
    public void visit(Engine engine) {
        System.out.println("Visiting engine");
    }
    public void visit(Body body) {
        System.out.println("Visiting body");
    }
 
    public void visit(Car car) {
        System.out.println("\nVisiting car");
        for(CarElement element : car.getElements()) {
            element.accept(this);
        }
        System.out.println("Visited car");
    }
 
}


die Schleife unnötig umständlich. Warum macht man das Ganze nicht einfach so:

Java:
class PrintVisitor implements Visitor {
 
    public void visit(Wheel wheel) {      
        System.out.println("Visiting "+ wheel.getName()
                            + " wheel");
    }
    public void visit(Engine engine) {
        System.out.println("Visiting engine");
    }
    public void visit(Body body) {
        System.out.println("Visiting body");
    }
 
    public void visit(Car car) {
        System.out.println("\nVisiting car");
        for(CarElement element : car.getElements()) {
            this.visit(element); // HIER IST DIE ÄNDERUNG !!!
        }
        System.out.println("Visited car");
    }
 
}


D.h. warum geht man als Besucher jedes Element durch (per for-Schleife) und sagt diesem (per " element.accept(this);"), dass er einen besuchen soll, was das Element anschließend macht (per "visitor.visit(this);").
Man kann doch viel besser als Besucher jedes Element durchgehen und dieses direkt besuchen, so wie ich es in meinem Ansatz versucht habe (ohne das man unnötige Umwege geht)


Das heißt das Verständnisproblem ist dass ich nicht verstehe, warum man den Elementen sagt sie sollen dem Besucher sagen, dass er sie besuchen soll und man nicht direkt dem Besucher reihenweise die Elemente gibt, die er besuch soll.

Viele Grüße und schönes Wochenende an alle :)
 

xehpuk

Top Contributor
Hey,

eigentlich wird schon ersichtlich, dass das nicht geht, wenn du es so probierst.
Du hast keine Methode
Code:
Visitor#visit(CarElement)
, weswegen es einen Compiler-Fehler gibt. Der Umweg über
Code:
CarElement#accept(Visitor)
ist gerade deswegen nötig – um bestimmen zu können, welche
Code:
visit()
-Methode aufgerufen werden soll.
Würdest du die Methode
Code:
Visitor#visit(CarElement)
erstellen, würde immer diese aufgerufen werden, weil in dem Fall schon zur Kompilier-Zeit bestimmt wird, welche Methode aufgerufen wird. Die Referenzvariable in der Schleife hat den Typ
Code:
CarElement
(und mehr ist nicht bekannt). Also passt auch nur diese eine Methode dazu.
 
M

maki

Gast
Das heißt das Verständnisproblem ist dass ich nicht verstehe, warum man den Elementen sagt sie sollen dem Besucher sagen, dass er sie besuchen soll und man nicht direkt dem Besucher reihenweise die Elemente gibt, die er besuch soll.
Das ist ein "expliziter" Double Dispatch, muss man in Java Falle leider explizit machen, da Java nur Single Dispatch direkt unterstützt.
Steht ja auch so im WikiPedia Artikel:
Man beachte, dass die accept-Methode tatsächlich in jeder Element-Klasse implementiert werden muss, damit der Compiler die richtige überladene visit-Methode auswählen kann.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
V besucher ip adresse anzeigen lassen Softwareentwicklung 7
D Vorteil des Entwurfsmusters Besucher/Visitor? Softwareentwicklung 4
B Design Patterns und die Keywords Softwareentwicklung 22
P Zwei Fragen zum Design Softwareentwicklung 16
K Einlesen einer .dat-Datei (verschiedene Formate) | Entwicklung unter Einsatz von Design-Patterns Softwareentwicklung 0
L Design Patterns zu abstraktem Problem Softwareentwicklung 2
M Sauberes Design, Clean Code, etc. pp. Softwareentwicklung 47
G Projekte die Design by Contract verwendet haben?? Softwareentwicklung 2
H2SO3- design pattern: code in model classes Softwareentwicklung 5
G Design Pattern gesucht! Softwareentwicklung 4
D Design Pattern Softwareentwicklung 6
C Wiki für ein Uni - High Level Design Softwareentwicklung 5
V Design Patters - Observer Softwareentwicklung 6
S Design Pattern für zwei abhängige Klassen Softwareentwicklung 8
Jay_030 Checkstyle: Lösungsvorschläge für Design for Extension Softwareentwicklung 7
J Design Patterns in Programm hineinfließen lassen Softwareentwicklung 23
G Suche Programm für Masken Design für Pflichtenheft Softwareentwicklung 5
W Frage zu a)Innere Klassen und b)OO Design Softwareentwicklung 13
D Datenbank-Design Softwareentwicklung 3
M Datei-Typ-Design Softwareentwicklung 10
K Design Pattern für einen simple Rechenmaschine Softwareentwicklung 18
S Design-Frage: Wie viele Fassaden? Softwareentwicklung 4
G Test First <-> Design First Softwareentwicklung 6

Ähnliche Java Themen

Neue Themen


Oben