業(yè)務(wù)規(guī)則與自定義規(guī)則處理庫(kù)
前篇隨筆《需求收集、分析》中簡(jiǎn)單提了一下業(yè)務(wù)規(guī)則。業(yè)務(wù)規(guī)則是很重要的一個(gè)東西,并且用戶對(duì)于業(yè)務(wù)規(guī)則也極易更改或者新增新的業(yè)務(wù)規(guī)則.尤其是在某些場(chǎng)合如促銷,積分商城等場(chǎng)景。正因?yàn)橐?guī)則如此重要,建議使用單獨(dú)的文檔
維護(hù),規(guī)則名稱編號(hào)可以與用例名稱編對(duì)一一對(duì)應(yīng)。
業(yè)務(wù)規(guī)則分類:
一,內(nèi)稟規(guī)則:業(yè)務(wù)實(shí)體本身的規(guī)則。如訂單中銷售記錄不能為空,數(shù)量不能為等。
二,全局規(guī)則:一般與所有用例相關(guān)而不是某個(gè)特定用例相關(guān)。例如系統(tǒng)安全方面的sql注入,ddos攻擊等。
三,交互規(guī)則:用于用例當(dāng)中。它們規(guī)定了滿足什么條件后業(yè)務(wù)將如何反應(yīng)。有些規(guī)則需要開發(fā)成系統(tǒng)用例。比如人事
管理系統(tǒng)中請(qǐng)假業(yè)務(wù)只有工作日才計(jì)入請(qǐng)假天數(shù),那么這個(gè)工作日就需要電腦來(lái)維護(hù)了,會(huì)作為一個(gè)系統(tǒng)用例存在,并
且作為請(qǐng)假用例的前置條件。 交互規(guī)則又是最容易引起.
交互規(guī)則如此靈活多變,需要良好的設(shè)計(jì)才能保證系統(tǒng)的擴(kuò)展性和可維護(hù)性。如何做:
思路一:
在 javax.swing.border包提供了Border接口和幾個(gè)不同的Boder的實(shí)現(xiàn)。在swing中每個(gè)組件提供了paint方法,每
個(gè)組件知道怎么畫自己展示自己的外觀。那么我們可以提供業(yè)務(wù)規(guī)則處理接口,每個(gè)具體業(yè)務(wù)規(guī)則自己知道怎么處理業(yè)務(wù)。
可以用簡(jiǎn)單工廠來(lái)決定調(diào)用哪一個(gè)具體業(yè)務(wù)規(guī)則。這個(gè)是策略模式的使用,缺點(diǎn)是新增具體業(yè)務(wù)時(shí)工廠類會(huì)修改。也可以
用觀察者模式來(lái)實(shí)現(xiàn),所有的具體業(yè)務(wù)類都來(lái)觀察這個(gè)業(yè)務(wù)規(guī)則,自己判斷是不是自己可以處理的,不是就不理會(huì)。
基于策略模式的規(guī)則實(shí)現(xiàn)類圖:

思路二:
規(guī)則引擎比如drools處理一些問(wèn)題 。規(guī)則引擎適合于做業(yè)務(wù)規(guī)則頻繁變化的場(chǎng)景.把業(yè)務(wù)規(guī)則抽出來(lái)通過(guò)規(guī)則引擎來(lái)
處理。類似工作流系統(tǒng)的概念。
自定義規(guī)則處理庫(kù):
一些動(dòng)態(tài)的語(yǔ)言很適合來(lái)做這樣的事情。java支持script.Mvel是一個(gè)表達(dá)式語(yǔ)言,drools也支持mvel來(lái)處理業(yè)務(wù)規(guī)則.
這里自定義規(guī)則引擎使用Mvel表達(dá)式語(yǔ)言.
規(guī)則文件示例:
<rules>
<!--rule-set 是一個(gè)規(guī)則集,執(zhí)行規(guī)則 rule1時(shí)會(huì)迭代規(guī)則集里面所有的規(guī)則(mvel-rule)-->
<rule-set name="rule1">
<!-- id是規(guī)則的標(biāo)識(shí),也是默認(rèn)的排序處理順序。exclusive 是排它。如果為true,則當(dāng)前規(guī)則執(zhí)行后,不再執(zhí)行后面的規(guī)則-->
<mvel-rule id="step1" exclusive="false">
<block><![CDATA[
if(salary<=3500) {result=0;}
]]></block>
</mvel-rule>
<mvel-rule id="step2" exclusive="false">
<block><![CDATA[if(salary>3500) {result=1};]]></block>
</mvel-rule>
</rule-set>
<rule-set name="rule2">
<mvel-rule id="step1" exclusive="false">
<block><![CDATA[
import com.custom.rule.*;
rs = new RuleSet();
rs.name="asdf";
rs.print();
]]></block>
</mvel-rule>
</rule-set>
</rules>
rule2中可見mvel可以導(dǎo)入未知jar包并進(jìn)行處理,確實(shí)強(qiáng)大,就有了足夠的靈活性. 自定義規(guī)則庫(kù)源碼及使用示例下載.本例依賴xstream1.4.9 ,mvel2.0
自定義規(guī)則庫(kù)除了可以應(yīng)用于一般系統(tǒng)業(yè)務(wù)處理,當(dāng)然也還可以用于大數(shù)據(jù)處理。比如hadoop/spark統(tǒng)計(jì)用戶積分等
如果再定義一套配置規(guī)則的UI。。。好的,業(yè)務(wù)人員可以自己設(shè)置計(jì)算規(guī)則了。
posted on 2017-08-20 14:52 傻 瓜 閱讀(2671) 評(píng)論(0) 編輯 收藏 所屬分類: 雜項(xiàng)