Alrite, ich bin Gonna Sprung direkt in den Code:Besuchermusterimplementierung in Java - Wie sieht das aus?
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 Basisimplementierung:
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
}
Sie werden sehen, warum ich eine leere Implementierung hier ... ich würde ein schreiben Validator jetzt .., die sich 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.
}
jetzt ist hier, was ein besuchbar würde wie folgt aussehen:
public Store implements Visitable {
public void accept(Visitor visitor) {
visitor.visitInventory();
visitor.visitMaxCount();
}
}
ich haben könnte Code, der so etwas wie diese auf einer Liste von Shop Objekte tut:
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 würden Sie ABCValidator haben, die Umsetzung für andere Methoden (visitCountry/visitSomethinElse) bieten würde, und es würde verlängern von StoreValidator. Ich hätte einen anderen Typ von Objekt (nicht Store), der die Methode accept definiert.
Ich sehe ein Problem hier ... Sag, ich brauche einen FileValidator, der sich von StoreValidator unterscheidet, ich würde erwarten, dass es keine dieser geschäftsbezogenen Validierungen wie visitInventory() usw. hat Eine einzige Schnittstelle Besucher, würde ich schließlich alle Arten von Methoden in Visitor-Schnittstelle deklarieren. Ist das korrekt? Tust du das so?
Ich weiß nicht, ob ich das Muster falsch verstanden habe, oder ob ich einen Sinn habe. Bitte teilen Sie Ihre Gedanken.
@dfa Strategie macht Sinn, jedoch würde dies zu einer so viele Strategien wie viele Geschäftsregeln führen.Ich hätte dann so viele Klassen - die wären zu viele. Die Idee hinter dem Besuch eines Besuchers ist, dass ich nicht viel tun sollte, wenn ich meinem Code Verhalten hinzufügen würde. – Jay
"... [wenn] Ihre Daten sich langsamer als Ihr Verhalten ändern." - das ist eine der besten Beschreibungen, die ich in Bezug auf das Besuchermuster gehört habe. +1 – Grundlefleck