2016-07-27 35 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