Hallo,
ich entwickle gerade einen Parser der einen abstrakten Syntaxbaum erzeugt. Die Elemente dieses Baums sollen dann auf unterschiedliche Weise dargestellt werden können. Meine derzeitige Implementierung sieht für diesen Zweck das Entwurfsmuster Besucher/Visitor vor.
Das sieht dann etwa so aus:
Nun stellt sich mir die Frage, warum eine Besuchte Klasse eine Methode des Visitors (visitor.render(this)) aufrufen sollte. Es muss ja ohnehin jedes Element von außen angefasst werden, um den Visitor zu übergeben. Statt also elementxy.accept(visitor) aufzurufen, woraufhin das elementxy sich selbst dem Visitor übergibt, könnte man doch auch gleich visitor.render(elementxy) schreiben, oder mache ich gerade einen Denkfehler?
ich entwickle gerade einen Parser der einen abstrakten Syntaxbaum erzeugt. Die Elemente dieses Baums sollen dann auf unterschiedliche Weise dargestellt werden können. Meine derzeitige Implementierung sieht für diesen Zweck das Entwurfsmuster Besucher/Visitor vor.
Das sieht dann etwa so aus:
Code:
public abstract class Visitor
{
public abstract void render(ElementA a);
public abstract void render(ElementB b);
}
public class VisitorHtml
{
public void render(ElementA a)
{
System.out.println("A");
}
public void render(ElementB b)
{
System.out.println("B");
}
}
public abstract class Element
{
public abstract void accept(Visitor visitor);
}
public class ElementA extends Element
{
public void accept(Visitor visitor)
{
visitor.render(this); // warum sollte das hier aufgerufen werden?
}
}
Nun stellt sich mir die Frage, warum eine Besuchte Klasse eine Methode des Visitors (visitor.render(this)) aufrufen sollte. Es muss ja ohnehin jedes Element von außen angefasst werden, um den Visitor zu übergeben. Statt also elementxy.accept(visitor) aufzurufen, woraufhin das elementxy sich selbst dem Visitor übergibt, könnte man doch auch gleich visitor.render(elementxy) schreiben, oder mache ich gerade einen Denkfehler?