黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

Java規(guī)則引擎-Drools

系統(tǒng) 3096 0

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

Java規(guī)則引擎-Drools

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

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è)務(wù)邏輯的方法,但是有以下的問(wèn)題:

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

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

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

<?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ī)則的意思是判斷股票價(jià)格是否小于100,如果100這個(gè)標(biāo)準(zhǔn)改變了,那么只要修改這個(gè)規(guī)則文件,而不用去修改源代碼了

?

?



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


Java規(guī)則引擎-Drools


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

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

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

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論