访问者模式可以解决这个问题
调用访问者验证器,可以实现以下功能:
公共接口Validatable:
public interface Validatable {
public boolean validate(Validator v);
}
公共接口Validator:
public interface Validator {
public boolean validate(A a);
public boolean validate(B b);
}
类A实现Validatable接口:
public class A implements Validatable {
public boolean validate(Validator v){
return v.validate(this);
}
}
类B实现Validatable接口:
public class B implements Validatable {
public void validate(Validator v) {
return v.validate(this);
}
}
默认验证器GenericValidator无法验证A和B:
public class GenericValidator implements Validator {
public boolean validate(A a) {
throw new UnsupportedOperationException("Cannot validate A");
}
public boolean validate(B b) {
throw new UnsupportedOperationException("Cannot validate B");
}
}
由于XYZValidation只能在A上运行,因此它仅覆盖A验证:
public class XYZValidation extends GenericValidator {
public boolean validate(A a) {
// 验证a
return isVAlid(a);
}
}
由于ABCValidation应该在A和B上运行,因此它覆盖了A和B的验证:
public class ABCValidation extends GenericValidator {
public boolean validate(A a) {
// 验证a
return isVAlid(a);
}
public boolean validate(B b) {
// 验证b
return isVAlid(b);
}
}
由于PPPValidation只能在B上运行,因此它仅覆盖B验证:
public class PPPValidation extends GenericValidator {
public boolean validate(B b) {
// 验证b
return isVAlid(b);
}
}