论坛首页 Java企业应用论坛

规则引擎-自己实现的灵活引擎V0.1-一下午终于折腾好了(附源码。)

浏览 5864 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-10-13   最后修改:2012-10-13
前沿:
以前发贴总是被隐藏,这次有做了N遍的测试终于又可以发贴了。(动不动就投别人隐藏,太不人道了哈)

直奔主题: 大家都肯定接触过规则引擎吧,就是那专家系统的核心组件。drools可火了,但是用起来麻烦,还不如自己实现个轻量级的。 以后再慢慢开发,希望大家多多参与哈。 现在弄的版本是0.1,无聊啊,就做个有点用的东西。也算是第一个给JE发个技术贴哈。

规则引擎的机制很多,有线型的,网络型的 。  本文最后是树形的,好处是:把规则编译成一个树,不用每次都去做计算,一个规则一个树模型。

具体实现看附件啊。

!!!不要喷程序写的乱:
申明:由于我不是一线codeing,对于程序的写法不规范,没那个时间去规范的写JAVA类。


主要用法:

public class TestRule {
public static void main(String[] args) {
HashMap<String, String> factVlues = new HashMap<String, String>();
//构建事实。
/////
ConditionDefine conditionDefine1 = new ConditionDefine();
。。。。。
ConditionDefine conditionDefine2 = new ConditionDefine();
。。。。。。";
//条件构建完成。

// ExpressionDefine
// {eid:201,strExpress:(101&102)}
ExpressionDefine myExpressionDefine = new ExpressionDefine();
myExpressionDefine.eId = "201";
myExpressionDefine.strExpress = "(101&102)";
//表达式构建完成。
FactObject fo = new FactObject();
fo.myExpressionDefine = myExpressionDefine;
fo.conditionList.add(conditionDefine1);
fo.conditionList.add(conditionDefine2);

for (int i = 0; i < fo.conditionList.size(); i++) {
ConditionDefine tmpConditionDefine = fo.conditionList.get(i);

if (tmpConditionDefine.operate.equals(">")) {
if (Integer.valueOf(factVlues.get(tmpConditionDefine.columName)) > Integer
.valueOf(tmpConditionDefine.rightValue)) {
fo.conditionFactList.put(tmpConditionDefine.cdtId, "true");

} else {
fo.conditionFactList.put(tmpConditionDefine.cdtId, "false");

}

}

if (tmpConditionDefine.operate.equals("=")) {
if( factVlues.get(tmpConditionDefine.columName).equals(tmpConditionDefine.rightValue)){
fo.conditionFactList.put(tmpConditionDefine.cdtId, "true");
}else{
fo.conditionFactList.put(tmpConditionDefine.cdtId, "false");
}

}
}
///组装完成,调用规则计算。
///start call rule
////////////////////////////////////////////////////////////////
ExpressStatic.hashMapingSrc= fo.conditionFactList;
//ExpressStatic.calc(fo.myExpressionDefine.strExpress+"#");
boolean result= ExpressStatic.getResuleNode(ExpressStatic.calc(fo.myExpressionDefine.strExpress+"#"));

System.out.println(result);




}

没有使用任何第三方组件,全部是JAVA实现。你们用起来不爽找我。。。 服务到家。。。

欢迎讨论。和学习,不要再投隐藏了,谢谢这里的大牛啊 ,真是怕了你们了 哈。 觉得有意思就顶个哈。

   发表时间:2012-10-15  
可否支持外部配置文件的,支持规则语言
0 请登录后投票
   发表时间:2012-10-15  
stillwalk 写道
可否支持外部配置文件的,支持规则语言


规则语言编写太老套了, 再说也不便于业务人员,
你让一个银行的业务需求员去写规则语言是不现实的。

所以我们要用拖拉的方式,直接在页面进行可视化编辑。把规则进行自动保存。

不错吧。

0 请登录后投票
   发表时间:2012-10-15  
菜菜土人 写道
stillwalk 写道
可否支持外部配置文件的,支持规则语言


规则语言编写太老套了, 再说也不便于业务人员,
你让一个银行的业务需求员去写规则语言是不现实的。

所以我们要用拖拉的方式,直接在页面进行可视化编辑。把规则进行自动保存。

不错吧。


呵呵不错,
2个问题:
1.ExpressStatic中getResuleNode方法左右子树全部判断得到结果以后再判断最后结果,
有没考虑到左子树比右子树短很多的情况,
2.接问题1,FactObject中要得到所有conditionFactList中的true/false值,对于101&(102|103...)的情况,只需要得到101为false即可结束判断

总结而言就是逻辑操作符判断时的短路情况
0 请登录后投票
   发表时间:2012-10-15  
stillwalk 写道
菜菜土人 写道
stillwalk 写道
可否支持外部配置文件的,支持规则语言


规则语言编写太老套了, 再说也不便于业务人员,
你让一个银行的业务需求员去写规则语言是不现实的。

所以我们要用拖拉的方式,直接在页面进行可视化编辑。把规则进行自动保存。

不错吧。


呵呵不错,
2个问题:
1.ExpressStatic中getResuleNode方法左右子树全部判断得到结果以后再判断最后结果,
有没考虑到左子树比右子树短很多的情况,
2.接问题1,FactObject中要得到所有conditionFactList中的true/false值,对于101&(102|103...)的情况,只需要得到101为false即可结束判断

总结而言就是逻辑操作符判断时的短路情况

=====================================================

知己啊, 看来你是真理解我的东西了,呵呵 。

你说的很对, 还有优化的余地,就像你说的 数的深度和长短,都有余地的。
这个我周末无聊 花了半天时间整的,有时间继续整,只是拿出来分享给JE的同胞,。

我主要是提供一个思路,一个方案。

BTW:只是我的代码写的凌乱,没有整理,各位高手见谅哈, 如果你优化了, 比如加了WEB界面,树的深度层次优化,也分享给我们哦 。。。。。。。


0 请登录后投票
   发表时间:2012-10-15  
stillwalk 写道
菜菜土人 写道
stillwalk 写道
可否支持外部配置文件的,支持规则语言


规则语言编写太老套了, 再说也不便于业务人员,
你让一个银行的业务需求员去写规则语言是不现实的。

所以我们要用拖拉的方式,直接在页面进行可视化编辑。把规则进行自动保存。

不错吧。


呵呵不错,
2个问题:
1.ExpressStatic中getResuleNode方法左右子树全部判断得到结果以后再判断最后结果,
有没考虑到左子树比右子树短很多的情况,
2.接问题1,FactObject中要得到所有conditionFactList中的true/false值,对于101&(102|103...)的情况,只需要得到101为false即可结束判断

总结而言就是逻辑操作符判断时的短路情况

---------------------------------------------------
逻辑是一部分, 你还没看明白条件部分的奥妙 哈哈 ,继续看哈 。。。
0 请登录后投票
   发表时间:2012-10-16  
菜菜土人 写道
stillwalk 写道
菜菜土人 写道
stillwalk 写道
可否支持外部配置文件的,支持规则语言


规则语言编写太老套了, 再说也不便于业务人员,
你让一个银行的业务需求员去写规则语言是不现实的。

所以我们要用拖拉的方式,直接在页面进行可视化编辑。把规则进行自动保存。

不错吧。


呵呵不错,
2个问题:
1.ExpressStatic中getResuleNode方法左右子树全部判断得到结果以后再判断最后结果,
有没考虑到左子树比右子树短很多的情况,
2.接问题1,FactObject中要得到所有conditionFactList中的true/false值,对于101&(102|103...)的情况,只需要得到101为false即可结束判断

总结而言就是逻辑操作符判断时的短路情况

---------------------------------------------------
逻辑是一部分, 你还没看明白条件部分的奥妙 哈哈 ,继续看哈 。。。

条件部分,貌似就看到两个条件:> =
多的条件判断,比如EQUALS,IN,NOT IN,LIKE都没有支持
0 请登录后投票
   发表时间:2012-10-16  
stillwalk 写道
菜菜土人 写道
stillwalk 写道
菜菜土人 写道
stillwalk 写道
可否支持外部配置文件的,支持规则语言


规则语言编写太老套了, 再说也不便于业务人员,
你让一个银行的业务需求员去写规则语言是不现实的。

所以我们要用拖拉的方式,直接在页面进行可视化编辑。把规则进行自动保存。

不错吧。


呵呵不错,
2个问题:
1.ExpressStatic中getResuleNode方法左右子树全部判断得到结果以后再判断最后结果,
有没考虑到左子树比右子树短很多的情况,
2.接问题1,FactObject中要得到所有conditionFactList中的true/false值,对于101&(102|103...)的情况,只需要得到101为false即可结束判断

总结而言就是逻辑操作符判断时的短路情况

---------------------------------------------------
逻辑是一部分, 你还没看明白条件部分的奥妙 哈哈 ,继续看哈 。。。

条件部分,貌似就看到两个条件:> =
多的条件判断,比如EQUALS,IN,NOT IN,LIKE都没有支持

--------------------------------------------------------
因为我只是练练手哈, 所以只写了两个条件,你自己多加几个CASE switch, 增加几个条件 不就好了, 很简单的吧。

目前只是0.1, 我觉得该方案是可行的,所以完善下去 其实是一个很好的东西。  你可以想象下,把我的module换成数据库表的话 是不是很high,很方便。

而且还支持多个fact的 object 比如 person.name=guo $car.driver=four ...
0 请登录后投票
   发表时间:2012-10-16  
还是想看看web里面如何配置,思路的问题,希望有截图,业务人员很轻松的配置
0 请登录后投票
   发表时间:2012-10-16  
coral0212 写道
还是想看看web里面如何配置,思路的问题,希望有截图,业务人员很轻松的配置


你把,ConditionDefine 
  ExpressionDefine
这几个模型弄成数据库表,是不是很容易联想到WEB了? 对头 你完善下数据表管理,完善下表结构,很快就会形成一个WEB系统。。。囧 又回到SSH了 。。。 可惜我不会 SSH ,SSH你自己搞定哈 。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics