我正在尝试为一些自定义验证实施策略模式,该验证模式不只涉及带有基本操作的验证输入,而是需要调用其他一些服务来验证数据。
在一开始,我使用了提到的示例here,该示例使用枚举来具有不同的策略,但是当然不可能将我的服务注入到枚举中,所以现在我来看看this利用Java 8更加清晰。
我的想法是拥有一个具有一个方法validate()
的接口,并为不同的对象提供通用输入,然后我可以将其发送给该对象,然后一个实现该接口的类将根据对象类型进行不同的验证,并将请求分派给不同的服务,但是另一方面,我有点失去了采用不同策略的枚举优势,这些策略可以根据特定的用户设置进行选择。
有人知道如何同时拥有这两个优势吗?
答案 0 :(得分:0)
我会说枚举和策略模式并没有真正混合在一起。
枚举的理想用例是代表一系列详尽选择的事物。例如,DayOfWeek
代表星期一至星期日。除了无法自动连接其他任何bean之外,使用此方法的问题还在于,随着验证次数的增加,您的枚举将继续增长。
策略模式允许您使用可能无限数量的可能策略,只要它遵守合同。以Collections.sort(List<T> list, Comparator<? super T> c)
为例。可能的比较器可能没有详尽的清单,因为它永远无法满足每个人的用例。
将每种可能的策略定义为一个组件
@Component
class NonNullValidationStrategy implements ValidationStrategy {
private final MyService service;
//constructor
@Override
public boolean isValid(MyClass foo) {
return foo != null;
}
}
在需要时如何获取正确策略的实例取决于您未提供的详细信息。也许可以使用限定符自动布线。
Spring已经有了own way of defining validations, via interfaces and annotations。我建议您在推出自己的解决方案之前继续这样做。
答案 1 :(得分:0)
它建议您使用javax.validation组,有关它的更多信息,here,尤其是@Validated(OnCreate.class)
如果您想在控制器级别应用策略模式,并且要比见this article(尤其是my comment)更深入,因为其中描述的解决方案不是很干净。