一、什么是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
李大嘴 閱讀(516)
評論(0) 編輯 收藏