基于输入

时间:2016-08-01 18:59:39

标签: java oop design-patterns

我正处于需要对给定对象执行某些验证的项目的设计阶段。 验证可以分为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...]
}

enter image description here

处理流程将从基于业务组的配置中获取验证器列表,并在包含的每个验证器中执行验证。

这种方法有什么缺陷吗? 或者有没有更好的方法来解决我描述的用例?

1 个答案:

答案 0 :(得分:1)

我建议对上述解决方案添加两项改进:

<强> 1。保证存在所需的验证规则

假设对于每个业务组应该执行相关的验证,应该有一些机制来保证配置指定足够的验证规则,即验证类。如果您有数十个属性,可能还有数百个业务组,那么在配置中出错就太容易了,即没有为Cost指定任何验证器。我的建议是在业务对象的级别上指定哪些属性需要验证器。然后创建某种对象工厂,它将根据业务组和验证要求将验证器绑定到对象。

我会遵循这种方法:

  1. 为每种类型的验证创建一个界面,例如ICostValidator和IWeightValidator。
  2. 在您的配置中,保留业务对象所需的验证器接口列表,例如:

    requiredValidators = [ICostValidator,IWeightValidator];

  3. 在BusinessGroupA或BusinessGroupB上执行验证时,请始终检查配置的验证程序是否实现了所有requiredInterfaces。

  4. <强> 2。将验证程序与特定业务对象分离

    如果您现在查看成本和重量验证,它们将绑定到业务对象。我不知道你的类图的其余部分,但我可以想象成本和重量的属性会出现在多个业务对象中,例如Item,QuotationLine,SalesOrderLine,ShippingLine等。那么最好有验证器不直接依赖于业务对象,可以轻松应用于多个业务对象。在对象工厂中,您还可以处理验证器和基础对象之间的正确绑定。

    如果您想要一些代码示例,请告诉我。