Besucher-Muster-Implementierung in java - Wie sieht das aus?

Alrite, ich bin gonna springen Sie direkt zu der code:

public interface Visitor {

public void visitInventory(); 
public void visitMaxCount();
public void visitCountry();
public void visitSomethingElse();
public void complete();
//the idea of this visitor is that when a validator would visit it, it would validate data
//when a persister visits it, it would persist data, etc, etc.
//not sure if I making sense here...
}

public interface Visitable {
public void accept(Visitor visitor); 
}

hier ist eine Basis-Implementierung:

public class StoreValidator implements Visitor {
private List <ValidationError> storeValidationErrors = new ArrayList<ValidationError>();

public void addError(ValidationError error) {
storeValidationErrors.add(error);
}

public List<ValidationError> getErrors() {
return storeValidationErrors;
}

public void visitInventory() {
//do nothing 
}

public void visitMaxCount() {
//do nothing
}
//... etc..  all empty implementations 

}

Werden Sie sehen, warum ich eine leere Implementierung hier... würde ich schreiben, eine Prüfung jetzt.. das reicht StoreValidator

public XYZValidator extends StoreValidator {

@Override 
public void visitInventory(Visitable visitable) { 
//do something with visitable .. cast it to expected type
//invoke a DAO, obtain results from DB
//if errors found, do addError(new ValidationError()); with msg.
}

@Override 
public void visitMaxCount(Visitable visitable) {
//do something with visitable.. 
}

//I wouldn't implement the rest coz they wouldn't make sense
//in XYZValidator.. so they are defined as empty in StoreValidator.

}

Nun, hier ist, was ein besuchbar würde wie folgt Aussehen:

public Store implements Visitable {

public void accept(Visitor visitor) {
visitor.visitInventory();
visitor.visitMaxCount();
}
}

Hätte ich code, der etwas tut, wie diese auf eine Liste der Objekte Speichern:

List<Store> stores; //assume this has a list of stores.
StoreValidator validator = new XYZValidator(); //or I would get it from a validatorfactory
for(Store store: stores) {
           store.accept(validator); //so even if you send a wrong validator, you are good.
}

Ähnlich wie man es hätte ABCValidator die Implementierung für andere Methoden (visitCountry /visitSomethinElse) und es würde reichen von StoreValidator. Ich hätte eine andere Art von Objekt (nicht Speichern) definieren akzeptieren-Methode.

Sehe ich hier ein problem...
Sagen, ich brauche eine FileValidator anders StoreValidator, würde ich erwarten, dass es keines dieser Unternehmen im Zusammenhang mit Validierungen, wie visitInventory(), etc. Aber, durch eine einzige Schnittstelle-Besucher, ich würde endup deklarieren alle Arten von Methoden in der Visitor-Schnittstelle. Ist das richtig? Ist dies, wie Sie es tun?

Ich weiß nicht, ob ich das Muster habe, falsch ist, oder ob ich mich Sinn macht.
Bitte teilen Sie Ihre Gedanken.

InformationsquelleAutor Jay | 2009-06-03
Schreibe einen Kommentar