一、什么是Drools
Drools是一个Bob McWhirter开发的开源项目,基于Charles Forgy's的Rete算法的,专为Java语言所设计的规则引擎。
Rete算法应用于面向对象的接口将使基于商业对象的商业规则的表达更为自然。
二、为什么要引入规则引擎
对于大多数项目的应用,一般通过选择些比较经典的、生命力强的框架,能使我们的开发更专注于商业逻辑的开发,提高我们的开发效率。
这些框架包括表现层框架(Struts, JSF),持久化框架(JDO, Hibernate,ibatis)以及结构框架(EJB, Spring), 还有其它很多。每种框架都各有所长,给开发者提供子许多“即开即用”的功能。使用框架来部署应用意味着你避免了许多让人厌烦的细节,让你集中注意力到关键之处。然而这些框架没有商业逻辑方面的,但对于项目来说,需求变更又是不可避免的,如何更大限度的分离商业逻辑,避免混淆于一般的流程控制中。
根据上图,可以清晰的看出如果有个商业逻辑框架存在,可以提高项目的灵活性、可维护性,从而达到敏捷开发。
三、什么时候适合用规则引擎
1、项目的复杂性
如果一个项目是一个轻量级的应用,跟大多数框架一样需要进行框架上复杂度的评估,以适应整个项目的管理。
下面讨论下EJB。
为什么现在大多数J2EE应用摒弃EJB?
EJB为了提供企业级应用集成了持久化、隔离性、安全性与事务完整性等系统服务,使开发者专注于业务本身要解决的实际问题,表明上看上去这样的系统简化了我们应用的开发,但这些业务功能实现的bean为了能在EJB容器管理下顺利运行,需要提供一系列的模版接口,而且在业务逻辑中需要加入管理bean生命方法的功能。这些代码的入侵性、紧耦合性、重复性使开发的风险及不确定因素急剧上升,而且对于各个EJB容器厂商的相关标准都不一致,导致系统的不可移植性都大大增加了整个项目的风险。
四、怎么用Drools
五、HelloWorld
该示例由两部分组成, 一个是调用规则的test.jsp :
//设置一个测试用的VO
Vo vo = new Vo();
vo.setPoStatus("A:draft");
//读入规则
RuleBase ruleBase = RuleBaseBuilder.buildFromURL("rule.drl");
//把vo放入WorkingMemory中并执行
WorkingMemory workingMemory = ruleBase.newWorkingMemory( );
workingMemory.assertObject( vo );
workingMemory.fireAllRules( );
//显示结果
out.print(po.getPoStatus());
一个是规则文件rule.drl:
<rule-set name="test rules"
<rule name="Bob Likes Cheese">
<parameter identifier="vo">
<java:class>com.ito.vo</java:class>
</parameter>
<java:condition>vo.getStatus().equals("A:draft")</java:condition>
<java:consequence>
vo.setStatus("B:order");
</java:consequence>
</rule>
</rule-set>
整个规则分成三段, 第一段定义刚刚放入的对象; 第二段用Java语法判断条件; 第三段为条件符合时的执行语句
经过小范围的试用,发现没有这么简单,因为Drools主要提供了一个RETE的规则匹配算法和一个Script Engine,具体怎么用,还要靠自己。如果drl文件的定义方式和RETE算法能够使条件的表达大大简化,那么它就是有用的。否则,一段重构后的代码能够达到和drl文件相仿的功能。所以,还是要多看点基础,把Business Rules用在正确的地方。
posted on 2007-08-20 11:20
李大嘴 阅读(509)
评论(0) 编辑 收藏