日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Java規(guī)則引擎-Drools

系統(tǒng) 2718 0

InfoQ發(fā)布了一個關于規(guī)則引擎的介紹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

下面總結(jié)一下其中的精華:

大多數(shù)web和企業(yè)Java應用可以分成三個部分:一個和用戶交互的前臺, 一個和后臺系統(tǒng),例如數(shù)據(jù)庫交互的服務層,以及他們中間的業(yè)務邏輯。 現(xiàn)在使用框架構(gòu)建前臺和后臺系統(tǒng)已經(jīng)成為普遍共識(例如, Struts, Cocoon, Spring, Hibernate, JDO, 和 Entity Beans), 但卻沒有一個標準的方法來構(gòu)建業(yè)務邏輯。一些框架,例如 EJB 和 Spring 只在一個高層實現(xiàn)業(yè)務邏輯,但對于我們組織邏輯代碼沒有任何幫助,所以,為什么沒有一個框架來替換冗繁,易錯的if...then語句呢,這個框架應該和其它前臺或后臺框架一樣,易于配置,具有可讀性和重用性。下面我們將介紹Drools 規(guī)則引擎,這個來解決我們問題的框架。

Java規(guī)則引擎-Drools

下面是一個典型的Java業(yè)務邏輯的代碼

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
}

這是大多數(shù)程序員寫業(yè)務邏輯的方法,但是有以下的問題:

  • 如果用戶有另一個選項,例如("C987") ,那么需要修改上面的代碼,當代碼很長的時候,修改代碼是難于維護的
  • 我們?nèi)绾伪WC代碼的正確性,這個代碼只有程序員能夠看到,真正的使用者,業(yè)務人員無法看到這個代碼
  • 很多應用程序有相同的業(yè)務邏輯,如果某個業(yè)務改變了,如何保證其他業(yè)務邏輯的一致性
  • 業(yè)務邏輯能否不合java語言綁定?
  • 業(yè)務邏輯能否用其他的腳本語言。

Java下的規(guī)則引擎標準就是JSR94,它的實現(xiàn)主要有 Jess ? Jena ? Drools

Drools中,一個典型的業(yè)務邏輯的配置,如下

<?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>

一條規(guī)則就是rule-set中的rule,如果有很多規(guī)則,就要寫很多的rule。

上面規(guī)則的意思是判斷股票價格是否小于100,如果100這個標準改變了,那么只要修改這個規(guī)則文件,而不用去修改源代碼了

?

?



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=815558


Java規(guī)則引擎-Drools


更多文章、技術(shù)交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 秀山| 临泽县| 许昌县| 土默特右旗| 乾安县| 亚东县| 武汉市| 澄江县| 霍邱县| 方正县| 原平市| 阿克苏市| 蓝山县| 崇仁县| 黄龙县| 昌图县| 建阳市| 绥宁县| 钟祥市| 泸西县| 宁海县| 垫江县| 苍梧县| 四会市| 平舆县| 全南县| 萨嘎县| 敦化市| 奉化市| 鹤岗市| 安平县| 射阳县| 合作市| 潮安县| 芦山县| 高邑县| 朔州市| 哈巴河县| 二连浩特市| 昌邑市| 庄河市|