基于Java的具有回退功能的简单规则引擎

基于Java的具有回退功能的简单规则引擎,java,implementation,rule-engine,business-rules,Java,Implementation,Rule Engine,Business Rules,我需要实现一个具有分层回退支持的简单规则引擎。我已经查看了DROOLS库,但我不确定它是否支持我的用例 用例非常简单,这让我思考是否需要一个规则引擎?然而,这里是用例- 我有一个有很多字段的模态 Public Class Entity { public int val0; public int val1; public int val2; public int val3; ..... } 现在,我想针对这些字段创建如下规则 RULE1 --- IF va

我需要实现一个具有分层回退支持的简单规则引擎。我已经查看了DROOLS库,但我不确定它是否支持我的用例

用例非常简单,这让我思考是否需要一个规则引擎?然而,这里是用例-

我有一个有很多字段的模态

Public Class Entity {
    public int val0;
    public int val1;
    public int val2;
    public int val3;
    .....
}
现在,我想针对这些字段创建如下规则

RULE1 --- IF val0 == 1 && val1 == 1 && val2 == 1 && val3 == 1 --- (1,1,1,1) THEN DO this
RULE2 --- IF val0 == 1 && val1 == 1 && val2 == 1 && val3 == 2, --- (1,1,1,2) THEN DO this
RULE3 --- IF val0 == 1 && val1 == 1 && val2 == 1 && val3 == *, --- (1,1,1,*) THEN DO this
RULE4 --- IF val0 == 1 && val1 == 1 && val2 == * && val3 == *, --- (1,1,*,*) THEN DO this 
问题在于
RULE3
RULE4
中的val2和val3可以匹配任何值

e、 g


因此,根据查询的不同,要么我将找到匹配的规则,要么我将不得不回退到更通用的规则。是否有任何现有的规则引擎库提供了这个功能,或者更确切地说,我甚至需要一个规则引擎库来实现这个功能吗?

起初我认为你可能想考虑使用位逻辑,但是有些字段采用非二进制值,这可能对你来说真的不管用。 然而,解决方案不必那么复杂。只需创建一个类作为
Entity
的值的匹配器,并使用if-else语句链来查找匹配项

class EntityMatcher {

    private Integer val0, val1, val2, val3;

    /** Constructor used to match all the parameters */
    EntityMatcher(int val0, int val1, int val2, int val3) {
        // set fields 0-3
    }

    /** Constructor used when you don't care about val2 & val3 */
    EntityMatcher(int val0, int val1) {
        // set fields 0 & 1, leaving val2 and val3 as null
    }

    boolean matches(Entity toMatchAgainst) {
        return (this.val0 == null || this.val0 == toMatchAgainst.val0)
            && (this.val1 == null || this.val1 == toMatchAgainst.val1)
            ...
            && (this.valN == null || this.valN == toMatchAgainst.valN);
    }

}
然后,您的规则引擎可以如下所示:

if (new EntityMatcher(1, 1, 1, 1).matches(entity))
    // Rule 1
else if (new EntityMatcher(1, 1, 1, 2).matches(entity))
    // Rule 2
...
else if (new EntityMatcher(1, 1).matches(entity))
    // Rule 4
...
else
   // no match

这基本上与。

一个完整的规则引擎对于只有几个变体的东西来说似乎有些过火,但它取决于你正在做什么以及你以后可能需要做什么的完整背景。
if (new EntityMatcher(1, 1, 1, 1).matches(entity))
    // Rule 1
else if (new EntityMatcher(1, 1, 1, 2).matches(entity))
    // Rule 2
...
else if (new EntityMatcher(1, 1).matches(entity))
    // Rule 4
...
else
   // no match