【问题标题】:A simple design pattern to develop a small Rule-Engine开发小型规则引擎的简单设计模式
【发布时间】:2010-11-25 09:58:51
【问题描述】:

我有一个要求,它需要根据 java 值对象验证大量规则并产生结果。 (我们公司不能使用任何规则引擎应用程序,手续繁多,需要回答的问题很多)。 所以,与其在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>

【问题讨论】:

    标签: java rule-engine


    【解决方案1】:

    这实际上取决于您尝试实施的规则的复杂性。声明式编程的关键思想是将规则视为数据。因此,最简单的开始方法是查看您的所有规则是否可以表示为表中的数据。例如,如果您的规则是 a=10,然后 b = 7 的类型,那么您可以在表中表示相同的规则并编写可以处理所有情况的通用方法。

    另一方面,如果您的规则允许多个条件(和/或子句以及比较运算符),则基于表格的设计将无济于事。

    在这种情况下,您需要为规则指定语法,生成词法分析器和解析器。解析器会将您的实际规则解析为抽象语法树。进入该阶段后,您可以使用该树并将其定位到现有规则引擎或您自己的知道如何执行该树的规则引擎。

    【讨论】:

      【解决方案2】:

      我会推荐Factory Method Pattern。每个规则都有一个可以创建这些规则的工厂。然后我会将所有这些规则工厂封装到一个Abstract Factory

      或者,您可以将规则引擎创建为构建器(使用Builder Pattern),允许传递规则集并构建规则。

      这是我最擅长的,但由于我不知道您的规则引擎的确切要求,所以我会想到什么。

      也许Strategy Pattern 可以帮助你?

      【讨论】:

        【解决方案3】:

        不完全是您所要求的(即模式),但如果您想自己动手,也许您会发现以下方法很有用:

        http://mcqueeney.com/blog/creating-a-simple-rules-engine-using-the-java-scripting-api/

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-05-22
          • 2010-09-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-26
          相关资源
          最近更新 更多