# Beispiel für Besuchermuster



## J.D. (27. Mai 2005)

Hallo,

ich suche ein Beispiel für das Besuchermuster. Bei google hab ich leider nichts ordentliches gefunden und das Beispiel im Buch "Entwurfsmuster" von E.Gamma hab ich nicht verstanden. Also wenn jemand was für mich hat, wäre ich sehr dankbar.


mfg J.D.


----------



## The_S (27. Mai 2005)

Besuchermuster? Was meinst du damit?


----------



## Bleiglanz (28. Mai 2005)

das Visitor Pattern

angenommen du hast eine Klasse Person

und du willst prüfen, ob die gewisse bedingungen erfüllt

wie machst du das, so dass der Code möglichst entkoppelt ist, darum gehts nämlich??

=> du lässt einen visitor eine person besuchen, das Pattern selbst ist reichlich trivial: beim Besuch bekommt der Besucher einfach this übergeben



```
// in person (das ist übrigens immer so:)
public accept(Personenvisitor v){
    v.visit(this); // immer das gleiche, der visitor bekommt "mich"
}

// der Personenvisitor

public boolean isGueltig;
public visit(Person p){
    // irgendein code, der Prüft ob p gültig ist
}


// Verwendung

Person p = ...// irgendwoher
PersonenVisitor validator = new Validator();

p.accept(validator);
if(validator.isGueltig){

}else
{

}
```


----------



## J.D. (28. Mai 2005)

Super, das hilft mir schon sehr viel weiter.  
Worum es bei dem Pattern so wirklich geht war mir nämlich auch noch nicht klar.
Also vielen Dank für die schnelle Antwort.


----------



## Doug.Heffernan (9. Jun 2005)

Da hätte ich jetzt auch noch mal ne Frage:

Also, ich habe ein ähnliches Problem:

Ich habe eine Klasse "Fassade" die den Besucher akzeptieren soll. 
Daher habe ich mir eine Klasse "Besucher" gebastelt. 
In diese habe ich folgendes reingeschrieben:


```
public class Besucher {

	public boolean isGueltig ;
	public boolean visit(Fassade f){
		return true;
	    
	}

}
```

Da soll natürlich noch mehr rein.

So, in Fassade habe ich dann reingeschrieben:


```
public void accept(Besucher v){
	    v.visit(this); 
	}
```

Verstehe ich das richtig, dass ich von Fassade dann immer neue Instanzen mache? 

Zur Erläuterung: Ich will in der Fassade einen Baum traversieren; wenn bestimmte Kriterien während der Traversion erkannt werden, dann soll der Besucher kommen und etwas mit dem Teilbaum machen.

Ist der Ansatz so richtig oder läuft da etwas falsch???

Für schnelle Hilfe wäre ich dankbar ;-)

MFG Dansen


----------



## Bleiglanz (9. Jun 2005)

> Verstehe ich das richtig, dass ich von Fassade dann immer neue Instanzen mache?


was hat das mit den Instanzen zu tun? GAR NICHTS

du brauchst natürlich mindestens eine, damit der Besucher was zu besuchen hat...



> Zur Erläuterung: Ich will in der Fassade einen Baum traversieren; wenn bestimmte Kriterien während der Traversion erkannt werden, dann soll der Besucher kommen und etwas mit dem Teilbaum machen.


nicht so gut, du kannst / sollst den Besucher ja nicht "einladen", sondern der Besuch muss von aussen angestossen werden

würde in deinem Fall die visit so schreiben, dass der Besucher auch gleich alle Kindknoten visited (und so rekursiv durch den Baum wandert) und wenn "bestimmte Kriterien erkannt werden" die weitere Verarbeitung dann vom Besucher ausgelöstwird


----------



## J.D. (9. Jun 2005)

> würde in deinem Fall die visit so schreiben, dass der Besucher auch gleich alle Kindknoten visited (und so rekursiv durch den Baum wandert) und wenn "bestimmte Kriterien erkannt werden" die weitere Verarbeitung dann vom Besucher ausgelöstwird



Genau das ist der Plan, die Rekursion ist schon da 


```
public static void iterateChildren(Node n) {
    
  //machIrgendwasMitNode(n);
     //System.out.println(n.getNodeName());
     //Testbedingungen festlegen
  
     NodeList list = n.getChildNodes();
     for(int i = 0; i < list.getLength(); i++) {
       Node child = list.item(i);
       //hier soll der Besucher was mit dem Knoten machen!
iterateChildren(child);
     }
   }
```

MFG JD


----------

