2016-07-27 40 views
0

我有一个使用情况下会出现3种数据类级别设计验证引擎2个独立的实体

  1. Business_Enrollment_Program(让表示他们BEP_1,BEP_2 ...)
  2. Validation_Rule(让我们用R1,R2表示它们)
  3. Transaction_Type(让我们用TT_1,TT_2 ...表示它们)。这是一个具有一些属性的实体类。在这些实体上需要执行Validation_Rule。

TRANSACTION_TYPE实体看起来像

public TT_1 { 
private Business_Enrollment_Program; 
private COMMON_FIELD_1; 
private COMMON_FIELD_2; 
private TT_1_SPECIFIC_FIELD; 
} 

public TT_2 { 
private Business_Enrollment_Program; 
private COMMON_FIELD_1; 
private COMMON_FIELD_2; 
private TT_2_SPECIFIC_FIELD; 
} 

现在我有2个要求,同时执行验证规则:

  1. 集Validation_Rule的需要被执行,取决于TRANSACTION_TYPE和它的Business_Enrollment_Program。 这意味着对于在BEP_1下注册的TT_1,我们可能需要执行(R1,R2)规则,但对于在BEP_2下注册的TT_1,我们可能需要执行(R1,R3)规则。

  2. 规则的行为将取决于Transaction_Type和它的Business_Enrollment_Program。这意味着根据规则R1的BEP_1行为TT_1招收相比TT_1可能不同BEP_2

下报名参加规则,我可以创建一个结构如下图所示:

,我可以执行规则像下面

public processTransaction(T transactioType) { 
    private boolean result = true; 
    if(t instanceof TT_1) { 
     result = result && R1_For_TT_1.execute(t); 
    } 
    else if (t instanceof TT_2) { 
     result = result && R1_For_TT_1.execute(t); 
     result = result && R2_For_TT_1.execute(t); 
    } 

    if(result) { 
    // Do something 
    } 
    else { 
    // Do something else 
    } 
} 

问题这种方法就是我没有达到我的地方我想规则的行为取决于TRANSACTION_TYPE 2号的要求,它的Business_Enrollment_Progr上午。

任何想法如何安排我的课程和实体,使我的两个要求得到优雅地满足?

+0

您的2个要求听起来一样。你能展示更多的照片吗?我没有看到使用这个返回的'boolean'。 – 4castle

+0

@ 4castle在第一个要求中,我想确定应该执行哪些规则。但是在第二个要求中,相同规则的行为需要改变。为了支持第二个要求,你可以考虑一个规则validateTotalAmount。现在如果实体TT_1与BEP_1逻辑相关以验证totalAmount与实体TT_1相比可能有所不同BEP_2 –

+0

是否有可能在任何商业程序上执行任何交易类型? – 4castle

回答

0

我会将每个BusinessEnrollmentProgram a Map<TransactionType, List<Rule>>作为一个字段,以便您可以组织Rule对象的每个TransactionType。这将使查找需要执行的Rule变得容易。

因此,这将是这个样子:

BusinessEnrollmentProgram.java

public class BusinessEnrollmentProgram { 

    private Map<TransactionType, List<Rule>> transactions = new HashMap<>(); 

    public void processTransaction(TransactionType t) { 
     List<Rule> rules = transactions.get(t); 
     boolean result = true; 
     for (Rule rule : rules) { 
      if (!rule.execute(t)) { 
       result = false; 
       break; 
      } 
     } 
     if (result) { 
      // do something 
     } else { 
      // do something else 
     } 
    } 
} 

TransactionType.java

public class TransactionType { 
    private COMMON_FIELD_1; 
    private COMMON_FIELD_2; 

    // override hashCode() & equals() here so it can be used as a HashMap key 
} 

然后让所有的交易类型extend TransactionType的,并让你的Map去st将所有关于Rule的关系与TransactionType联系在一起。每个BusinessEnrollmentProgram应该有一组单独的规则可供借鉴。

如果您发现扩展Rule的类过多,请改用anonymous classeslambda expressions