2010-11-25 34 views
5

我有一個需要對java值對象進行驗證的很多規則併產生結果。 (我們無法使用我們公司的任何規則引擎應用程序,很多手續和很多問題需要回答)。 所以,我建議實現一個小規則引擎Simple和Extensible,而不是像在java代碼中那樣實現規則。 要遵循哪種設計模式?一個簡單的設計模式來開發一個小的規則引擎

我在下面添加了規則定義的粗略xml結構。

<rule-set>  
    <name>Example1</name> 
    <description>Example rules defined</description> 

    <beans> 
     <bean class="com.example.Customer" alias="cust"/> 
     <bean class="com.example.Account" alias="acnt"/> 
     <bean class="com.example.Transaction" alias="trans"/> 
    </beans> 

    <rule name="CustomerInfo" description="This rule validates if all the customer values are present"> 
     <if lhs="cust.getFirstName" rhs="null" operator="!="/> 
     <if lhs="cust.getLastName" rhs="null" operator="!=" logicaloperator="&amp;&amp;"/> 
     <if lhs="cust.getCountry" rhs="null" operator="!=" logicaloperator="||"/> 
     <if lhs="cust.getCity" rhs="null" operator="!=" logicaloperator="&amp;&amp;"/> 
     <if lhs="cust.getPhone" rhs="null" operator="!=" logicaloperator="&amp;&amp;"/> 
     <if lhs="cust.getEmail" rhs="null" operator="!=" logicaloperator="&amp;&amp;"/> 
     <then do="cust.completeFlag" arg1="true"/> 
    </rule> 

    <rule name="Transaction" description="Transfer the money from one ac to another"> 
     <if lhs="trans.fromAccount" operator="!=" rhs="null"/> 
     <if lhs="trans.toAccount" operator="!=" rhs="null"/> 
     <if lhs="trans.fromAccount.balance" operator=">" rhs="trans.getTransaferAmount"/> 
     <then do="trans.fromAccount.debit" arg1="trans.getTransaferAmount"/> 
     <then do="trans.toAccount.credit" arg1="trans.getTransaferAmount"/> 
    </rule> 

</rule-set> 

回答

0

我會建議Factory Method Pattern。每個規則都有一個可以創建這些規則的工廠。然後我會將所有這些規則工廠封裝到一個Abstract Factory

或者,您可以創建規則引擎作爲Builder(使用Builder Pattern),該規則引擎允許傳遞規則集並構造規則。

這就是我最擅長的,但因爲我不知道你的規則引擎的確切要求,所以想到了什麼。

也許Strategy Pattern可以幫到你嗎?

4

這實際上取決於您試圖實施的規則的複雜性。聲明式編程的關鍵思想是將規則視爲數據。所以,最簡單的方法就是看你的規則是否可以表示爲表格中的數據。例如,如果你的規則的類型是a = 10,那麼b = 7,那麼你可以在表中表示相同的內容,並編寫一個可處理所有情況的通用方法。另一方面,如果您的規則允許多個條件(和/或子句以及比較運算符),則基於表格的設計將無濟於事。

在這種情況下,您需要爲規則指定語法,生成詞法分析器和分析器。解析器會將您的實際規則解析爲抽象語法樹。一旦你到達了這個階段,你可以採取那棵樹並將它定位到一個現有的規則引擎或者你自己的知道如何執行樹的規則引擎。