[英]Java design, calling the associated business logic/service
我有3个对象,一个称为BalanceDTO
的DTO,它实现了一个接口RequestDTO
和一个Balance
Entity。 我创建DTO是因为我不能使用实体,即JAXB合规性(旧版代码)。
DTO用于Web服务层BalanceService
,并且我从Web服务集成到的API中的Entity。 在Web服务和API之间存在验证。 RequestValidation
具有对每种RequestDTO
类型的子验证,即BalanceRequestValidation
。
验证组件接受RequestDTO
作为参数,然后需要对特定组件进行验证。 在输入时,验证组件不知道哪个对象已传递给它,即BalanceDTO
,它仅看到接口。
我想避免使用instanceof,因此我考虑在DTO上使用访问者,以便将其委托给需要在其上执行的验证。
但是验证不仅需要BalanceDTO
作为输入参数,还需要更多/其他组件,并且不同的验证需要不同的输入参数。
是否有另一种方法可以知道您正在使用哪个对象以及无需使用instanceof即可选择的验证? 我可以遵循的另一种设计?
您在这里的路线正确-访客设计模式通常是避免垂头丧气的最佳方法。
我将建议将visitor
和delegation
设计模式组合在一起,尽管让我们逐步介绍一些替代方法。
让对象自己通过RequestDTO
接口进行验证是不可行的,因为您需要使用不同的组件,并且验证本质上并不简单。
使用instanceof
和downcast看起来有些混乱,并且如果您添加新的Validatable类而忘记添加验证器,则编译器将不会抱怨-您将通过...else { throw new IllegalArgumentException("Unknown RequestDTO subtype!"); }
...else { throw new IllegalArgumentException("Unknown RequestDTO subtype!"); }
visitor
设计模式是避免向下转换的经典方法,如果您添加了一个应该可验证的新类,却忘记了添加验证,它还会给您带来编译器错误。
您可以使用accept()
和visit()
方法,也可以使用更接近您的域的方法命名,例如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
验证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
设计模式结合使用)确实是一个好方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.