java隨記

          堅(jiān)持就是勝利!

           

          業(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ù)性。如何做:
          思路一:
              在 j
          avax.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ù)源碼及使用示例下載.
          本例依賴xstream
          1.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)

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(7)

          我參與的團(tuán)隊(duì)

          隨筆分類

          隨筆檔案

          文章分類

          友情鏈接

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 随州市| 林芝县| 石楼县| 华阴市| 安化县| 康保县| 旬邑县| 朝阳区| 聊城市| 沁源县| 萝北县| 祁门县| 南阳市| 广东省| 云梦县| 重庆市| 隆德县| 垣曲县| 叶城县| 阳泉市| 横山县| 黑水县| 河南省| 承德县| 汾西县| 乡城县| 江山市| 灵武市| 合川市| 孙吴县| 临桂县| 青冈县| 金阳县| 体育| 泌阳县| 明星| 大庆市| 南安市| 尼玛县| 墨江| 军事|