gpt4 book ai didi

Java设计,调用相关业务逻辑/服务

转载 作者:太空宇宙 更新时间:2023-11-04 07:17:09 24 4
gpt4 key购买 nike

我有 3 个对象,一个名为 BalanceDTO 的 DTO,它实现了一个 RequestDTO 接口(interface)和一个 Balance 实体。我创建了 DTO,因为我无法使用该实体,即 JAXB 合规性(旧代码)。

DTO 用于 Web 服务层 BalanceService 以及我从 Web 服务集成的 API 中的实体。 Web 服务和 API 之间存在验证。 RequestValidation,它对每种类型的 RequestDTO 进行子验证,即 BalanceRequestValidation

验证组件接收RequestDTO作为参数,然后需要对特定组件进行验证。在输入时,验证组件不知道哪个对象已传递给它,即 BalanceDTO,它只看到接口(interface)。

我想避免使用 instanceof,因此我考虑在 DTO 上使用访问者,以便它将自己委托(delegate)给需要对其执行的验证。

但是验证还需要更多/其他组件,而不仅仅是 BalanceDTO 作为输入参数,并且不同的验证需要不同的输入参数。

是否有另一种方法可以在不使用instanceof的情况下知道您正在使用哪个对象以及要选择的验证?我可以遵循的另一种设计吗?

最佳答案

您的思路是正确的 - 访问者设计模式通常是避免向下转型的最佳方法。

我将建议结合使用访问者委托(delegate) 设计模式,不过让我们来看看一些替代方案。

让对象通过 RequestDTO 接口(interface)自行进行验证是不可行的,因为您需要不同的组件,并且验证本质上并不简单。

使用 instanceof 和向下转换看起来有点困惑,如果您添加新的可验证类并忘记添加 validator ,编译器不会提示 - 您将依赖于通过 ...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)给特定的验证组件,如下所示:

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 设计模式相结合)确实是一个很好的方法。

关于Java设计,调用相关业务逻辑/服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19806963/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com