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

问题描述 投票:0回答:2

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

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

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

任何想法如何同时具有这两个优点?

java spring spring-boot java-8 strategy-pattern
2个回答
0
投票

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

枚举的理想用例是代表详尽选择的东西。例如,DayOfWeek代表星期一至星期日。使用此功能的问题,除了无法自动连接任何其他bean外,还在于随着验证次数的增加,您的枚举将继续增长。

策略模式允许您使用可能的无限数量的可能策略,只要它遵守合同。以DayOfWeek为例。可能的比较器可能没有详尽的清单,因为它永远无法满足每个人的用例。

将每种可能的策略定义为一个组件更有意义

Collections.sort(List<T> list, Comparator<? super T> c)

您在需要时如何获得正确策略的实例将取决于您未提供的详细信息。也许可以使用限定符自动装配。


春天已经有了Collections.sort(List<T> list, Comparator<? super T> c)。我建议您在推出自己的解决方案之前继续这样做。


0
投票

[建议使用javax.validation组,请参见@Component class NonNullValidationStrategy implements ValidationStrategy { private final MyService service; //constructor @Override public boolean isValid(MyClass foo) { return foo != null; } } 特别是own way of defining validations, via interfaces and annotations] >>

如果您要在控制器级别应用策略模式,并且要比参见here特别是@Validated(OnCreate.class)更深入,因为其中描述的解决方案不是很干净的。

© www.soinside.com 2019 - 2024. All rights reserved.