使用Java 8和服务注入的策略模式

时间:2020-04-23 17:38:51

标签: java spring spring-boot java-8 strategy-pattern

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

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

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

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

2 个答案:

答案 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)更深入,因为其中描述的解决方案不是很干净。