您在这里走在正确的轨道上 - 访问者设计模式通常是避免向下转换的最佳方式。
我将建议将设计模式visitor
和delegation
设计模式结合起来,但让我们来看看一些替代方案。
让对象通过RequestDTO
接口自己进行验证是不可行的,因为您需要不同的组件,并且验证本质上并不是微不足道的。
使用instanceof
和向下转换看起来有点混乱,如果您添加一个新的可验证类并忘记添加验证器,编译器不会抱怨 - 您将依赖于运行时错误...else { throw new IllegalArgumentException("Unknown RequestDTO subtype!"); }
设计模式是避免向下转换的visitor
经典方法,而且如果您添加一个应该是可验证的新类并且忘记添加验证,它也会给您一个编译器错误。
您可以使用accept()
andvisit()
方法,或者您可以使用更接近您的域的方法命名,例如validate()
,像这样:
public interface RequestDTO {
boolean validate(RequestValidation validator);
}
public class BalanceDTO implements RequestDTO {
// ...
@Override
public boolean validate(RequestValidation validator) {
return validator.validate(this);
}
}
public class RequestValidation {
// components...
public boolean validate(BalanceDTO balanceDTO) {
return true; // todo...
}
public boolean validate(AnotherDTO anotherDTO) {
return true; // todo...
}
}
如果您想更进一步,您可以delegate
对特定的验证组件进行验证,如下所示:
public class RequestValidation {
BalanceRequestValidation balanceRequestValidation;
AnotherRequestValidation anotherRequestValidation;
public boolean validate(BalanceDTO balanceDTO) {
return balanceRequestValidation.validate(balanceDTO, a, b, c);
}
public boolean validate(AnotherDTO anotherDTO) {
return anotherRequestValidation.validate(anotherDTO, x, y, z);
}
}
鉴于我已经正确理解了您的问题,visitor
设计模式(可能与delegation
设计模式相结合)确实是一种好方法。