【发布时间】:2009-06-03 13:42:21
【问题描述】:
Alrite,我要直接跳到代码:
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);
}
这是一个基本实现:
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
}
你会明白为什么我在这里做了一个空的实现......我现在要写一个验证器......它扩展了 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.
}
现在这是可访问的样子:
public Store implements Visitable {
public void accept(Visitor visitor) {
visitor.visitInventory();
visitor.visitMaxCount();
}
}
我可以在 Store 对象列表上编写执行类似操作的代码:
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.
}
同样,您将拥有 ABCValidator,它将为其他方法(visitCountry / visitSomethinElse)提供实现,并且它将从 StoreValidator 扩展。我会有另一种类型的对象(不是存储)定义接受方法。
我确实看到这里有问题... 说,我需要一个与 StoreValidator 不同的 FileValidator,我希望它没有这些与业务相关的验证,例如 visitInventory() 等。但是,通过使用单个接口访问者,我最终会在访客界面。那是对的吗?你是这样做的吗?
我不知道我是否弄错了模式,或者我是否有任何意义。 请分享您的想法。
【问题讨论】:
标签: java visitor-pattern