一个简单的设计模式来开发一个小规则引擎

Vij*_*van 5 java rule-engine

我有一个要求,它需要对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>
Run Code Online (Sandbox Code Playgroud)

Sri*_*ram 5

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

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

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


Buh*_*ndi 1

我会推荐工厂方法模式。每个规则都有一个可以创建这些规则的工厂。然后,我将所有这些规则工厂封装到抽象工厂中。

或者,您可以创建一个规则引擎作为构建器(使用构建器模式),允许传递规则集并构建规则。

这就是我最想做的,但由于我不知道你的规则引擎的确切要求,所以我想到了这一点。

也许策略模式可以帮助您?