我正在尝试为一些自定义验证实现策略模式,这些自定义验证不仅涉及带有基本操作的验证输入,而且我确实需要调用一些其他服务来验证数据。
在开始的时候,我使用了提到的here的例子,它使用了枚举来拥有不同的策略,但是当然不可能将我的服务注入到枚举中,所以现在我来看看利用java 8的this,以获得更清晰的理解。
我的想法是有一个接口,有一个方法validate()
,并为不同的对象提供通用输入,我可以发送它,然后一个类实现该接口,该接口将根据对象类型进行不同的验证,并将请求分派到不同的服务,但另一方面,我有点失去了枚举的优势,因为我可以根据特定的用户设置选择不同的策略。
你知道如何同时拥有这两种优势吗?
2条答案
按热度按时间raogr8fs1#
我认为枚举和策略模式并没有真正混合在一起。
枚举的理想用例是代表一组详尽的选择。例如,
DayOfWeek
代表星期一到星期日。使用这种方法的问题是,除了不能自动连接任何其他bean之外,您的枚举将随着验证数量的增加而继续增长。strategy模式允许你使用无限多的可能策略,只要它遵守契约。以
Collections.sort(List<T> list, Comparator<? super T> c)
为例,可能没有详尽的比较器列表,因为它永远无法满足每个人的用例。将你的每一个可能的策略定义为一个组件会更有意义
字符串
当你需要的时候,你如何获得正确策略的示例将取决于你没有提供的细节。也许带限定符的自动装配是一种可能。
Spring已经有了它的own way of defining validations, via interfaces and annotations。我建议你在推出自己的解决方案之前先研究一下。
pftdvrlh2#
它建议使用javax。验证组,查看更多关于它的信息here,特别是
@Validated(OnCreate.class)
如果你想在控制器级别应用策略模式,请参阅this article,特别是my comment,因为这里描述的不是一个很干净的解决方案。