InfoQ發布了一個關于規則引擎的介紹Real-World Rule Engines,原文 http://www.infoq.com/articles/Rule-Engines ?
ONJava上也有兩篇文章:
Give Your Business Logic a Framework with Drools http://www.onjava.com/lpt/a/6093
Using Drools in Your Enterprise Java Application? http://www.onjava.com/lpt/a/6160
下面總結一下其中的精華:
大多數web和企業Java應用可以分成三個部分:一個和用戶交互的前臺, 一個和后臺系統,例如數據庫交互的服務層,以及他們中間的業務邏輯。 現在使用框架構建前臺和后臺系統已經成為普遍共識(例如, Struts, Cocoon, Spring, Hibernate, JDO, 和 Entity Beans), 但卻沒有一個標準的方法來構建業務邏輯。一些框架,例如 EJB 和 Spring 只在一個高層實現業務邏輯,但對于我們組織邏輯代碼沒有任何幫助,所以,為什么沒有一個框架來替換冗繁,易錯的if...then語句呢,這個框架應該和其它前臺或后臺框架一樣,易于配置,具有可讀性和重用性。下面我們將介紹Drools 規則引擎,這個來解決我們問題的框架。
下面是一個典型的Java業務邏輯的代碼
if ((user.isMemberOf(AdministratorGroup)
????? && user.isMemberOf(teleworkerGroup))
???? || user.isSuperUser(){
????????
???????? // more checks for specific cases
???????? if((expenseRequest.code().equals("B203")
?????????? ||(expenseRequest.code().equals("A903")
??????????????????????? &&(totalExpenses<200)
??????????????? &&(bossSignOff> totalExpenses))
?????????? &&(deptBudget.notExceeded)) {
?????????????? //issue payments
?????????? } else if {
?????????????? //check lots of other conditions
?????????? }
} else {
???? // even more business logic
}
這是大多數程序員寫業務邏輯的方法,但是有以下的問題:
- 如果用戶有另一個選項,例如("C987") ,那么需要修改上面的代碼,當代碼很長的時候,修改代碼是難于維護的
- 我們如何保證代碼的正確性,這個代碼只有程序員能夠看到,真正的使用者,業務人員無法看到這個代碼
- 很多應用程序有相同的業務邏輯,如果某個業務改變了,如何保證其他業務邏輯的一致性
- 業務邏輯能否不合java語言綁定?
- 業務邏輯能否用其他的腳本語言。
Java下的規則引擎標準就是JSR94,它的實現主要有 Jess ? Jena ? Drools
Drools中,一個典型的業務邏輯的配置,如下
<?xml version="1.0"?>
<rule-set name="BusinessRulesSample"
? xmlns="http://drools.org/rules"
? xmlns:java="http://drools.org/semantics/java"
? xmlns:xs
??? ="http://www.w3.org/2001/XMLSchema-instance"
? xs:schemaLocation
??? ="http://drools.org/rules rules.xsd
? http://drools.org/semantics/java java.xsd">
? <!-- Import the Java Objects that we refer
????????????????????????? to in our rules -->???????
? <java:import>
??? java.lang.Object
? </java:import>
? <java:import>
??? java.lang.String
? </java:import>
? <java:import>
??? net.firstpartners.rp.StockOffer
? </java:import>
? <!-- A Java (Utility) function we reference
??? in our rules-->?
? <java:functions>
??? public void printStock(
????? net.firstpartners.rp.StockOffer stock)
??????? {
??????? System.out.println("Name:"
????????? +stock.getStockName()
????????? +" Price: "+stock.getStockPrice()????
????????? +" BUY:"
????????? +stock.getRecommendPurchase());
??????? }
? </java:functions>
<rule-set>
? <!-- Ensure stock price is not too high-->?????
? <rule name="Stock Price Low Enough">
??? <!-- Params to pass to business rule -->
??? <parameter identifier="stockOffer">
????? <class>StockOffer</class>
??? </parameter>
??? <!-- Conditions or 'Left Hand Side'
??????? (LHS) that must be met for
???????? business rule to fire -->
??? <!-- note markup -->
??? <java:condition>
????? stockOffer.getRecommendPurchase() == null
??? </java:condition>
??? <java:condition>
????? stockOffer.getStockPrice() < 100
??? </java:condition>
??? <!-- What happens when the business
????????????????????? rule is activated -->
??? <java:consequence>
??????? stockOffer.setRecommendPurchase(
????????????????????????????? StockOffer.YES);?
????????? printStock(stockOffer);
??? </java:consequence>
? </rule>
</rule-set>
一條規則就是rule-set中的rule,如果有很多規則,就要寫很多的rule。
上面規則的意思是判斷股票價格是否小于100,如果100這個標準改變了,那么只要修改這個規則文件,而不用去修改源代碼了
?
?
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=815558
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
