我正处于需要对给定对象执行某些验证的项目的设计阶段。 验证可以分为5个不同的组。每个类别的验证器可以有多个版本,它们的实现略有不同。
public interface Validator {
boolean validate(Object o);
}
public abstract CostValidator implements Validator {
//common logic related to cost validator
}
public class CostValidator1 extends CostValidator {
boolean validate(Object o) {
//implementation 1
}
public class CostValidator2 extends CostValidator {
boolean validator(Object o) {
//implementation 2
}
根据对象的业务组,需要执行CostValidator1或CostValidator2。
对于每个业务组,我计划在配置系统中维护这样的验证器列表,即:
BusinessGroupA {
validators = [CostValidator1, SomeOtherValidator2...]
}
BusinessGroupB {
validators = [CostValidator2, AnotherValidator99...]
}
处理流程将从基于业务组的配置中获取验证器列表,并在包含的每个验证器中执行验证。
这种方法有什么缺陷吗? 或者有没有更好的方法来解决我描述的用例?
答案 0 :(得分:1)
我建议对上述解决方案添加两项改进:
<强> 1。保证存在所需的验证规则
假设对于每个业务组应该执行相关的验证,应该有一些机制来保证配置指定足够的验证规则,即验证类。如果您有数十个属性,可能还有数百个业务组,那么在配置中出错就太容易了,即没有为Cost指定任何验证器。我的建议是在业务对象的级别上指定哪些属性需要验证器。然后创建某种对象工厂,它将根据业务组和验证要求将验证器绑定到对象。
我会遵循这种方法:
在您的配置中,保留业务对象所需的验证器接口列表,例如:
requiredValidators = [ICostValidator,IWeightValidator];
在BusinessGroupA或BusinessGroupB上执行验证时,请始终检查配置的验证程序是否实现了所有requiredInterfaces。
<强> 2。将验证程序与特定业务对象分离
如果您现在查看成本和重量验证,它们将绑定到业务对象。我不知道你的类图的其余部分,但我可以想象成本和重量的属性会出现在多个业务对象中,例如Item,QuotationLine,SalesOrderLine,ShippingLine等。那么最好有验证器不直接依赖于业务对象,可以轻松应用于多个业务对象。在对象工厂中,您还可以处理验证器和基础对象之间的正确绑定。
如果您想要一些代码示例,请告诉我。