如何解决具有回退功能的基于Java的简单规则引擎
我需要实现一个具有分层后备支持的简单规则引擎。我已经研究过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) THEN DO this
RULE2 --- IF val0 == 1 && val1 == 1 && val2 == 1 && val3 == 2,--- (1,2) THEN DO this
RULE3 --- IF val0 == 1 && val1 == 1 && val2 == 1 && val3 == *,*) THEN DO this
RULE4 --- IF val0 == 1 && val1 == 1 && val2 == * && val3 == *,*,*) THEN DO this
问题出在RULE3
和RULE4
上,其中val2和val3可以匹配任何值。
例如
val0=1,val1=1,val2=1,val3=1 -- should execute RULE1 - specific match
val0=1,val3=3 -- should execute RULE3 - generic match as there's no specific match for val3
val0=1,val2=10,val3=5 -- should execute RULE4 - generic match as there's no specific match for val2 and val3
因此,根据查询,我要么找到匹配的规则,要么不得不回退到更通用的规则。是否存在任何提供此功能的规则引擎库,或者我什至需要一个规则引擎库来实现此功能?
解决方法
起初我以为您可能想考虑使用按位逻辑,但是对于某些采用非二进制值的字段,这可能实际上对您不起作用。
但是,解决方案不必那么复杂。只需创建一个充当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).matches(entity))
// Rule 1
else if (new EntityMatcher(1,2).matches(entity))
// Rule 2
...
else if (new EntityMatcher(1,1).matches(entity))
// Rule 4
...
else
// no match
这与case classes in Scala基本上是相同的想法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。