我正在尝试为一些自定义验证实现策略模式,该验证模式不只涉及带有基本操作的验证输入,而是需要调用其他服务来验证数据。

在开始时,我使用了提到的示例here,该示例使用枚举来具有不同的策略,但是当然不可能将我的服务注入到枚举中,所以现在我在研究this,它利用Java 8来提高清晰度。 。

我的想法是让一个接口具有一个方法validate()并为我可以发送的不同对象提供通用输入,然后实现该接口的类将根据对象类型进行不同的验证并将请求分派给不同的服务,但是另一方面,我有点失去枚举优势,因为我可以根据特定的用户设置选择不同的策略。

知道如何同时拥有这两个优点吗?

最佳答案

我会说枚举和策略模式并没有真正混合在一起。

枚举的理想用例是代表一系列详尽选择的事物。例如,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。我建议您在推出自己的解决方案之前继续这样做。

08-18 17:22
查看更多