java隨記

          堅持就是勝利!

           

          業(yè)務(wù)規(guī)則與自定義規(guī)則處理庫

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

          思路二:
               規(guī)則引擎比如drools處理一些問題 。
          規(guī)則引擎適合于做業(yè)務(wù)規(guī)則頻繁變化的場景.把業(yè)務(wù)規(guī)則抽出來通過規(guī)則引擎來
          處理。類似工作流系統(tǒng)的概念。

          自定義規(guī)則處理庫:
               一些動態(tài)的語言很適合來做這樣的事情。java支持script.Mvel是一個表達式語言,drools也支持mvel來處理業(yè)務(wù)規(guī)則.
          這里自定義規(guī)則引擎使用Mvel表達式語言.
                規(guī)則文件示例:
               
          <rules>
                 <!--rule-set 是一個規(guī)則集,執(zhí)行規(guī)則 rule1時會迭代規(guī)則集里面所有的規(guī)則(mvel-rule)-->
          <rule-set name="rule1">
          <!-- id是規(guī)則的標識,也是默認的排序處理順序。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包并進行處理,確實強大,就有了足夠的靈活性. 自定義規(guī)則庫源碼及使用示例下載.
          本例依賴xstream
          1.4.9 ,mvel2.0
          自定義規(guī)則庫除了可以應(yīng)用于一般系統(tǒng)業(yè)務(wù)處理,當(dāng)然也還可以用于大數(shù)據(jù)處理。比如hadoop/spark統(tǒng)計用戶積分等
          如果再定義一套配置規(guī)則的UI。。。好的,業(yè)務(wù)人員可以自己設(shè)置計算規(guī)則了。






          posted on 2017-08-20 14:52 傻 瓜 閱讀(2659) 評論(0)  編輯  收藏 所屬分類: 雜項

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(7)

          我參與的團隊

          隨筆分類

          隨筆檔案

          文章分類

          友情鏈接

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 青田县| 农安县| 武宣县| 库车县| 西畴县| 手游| 阳泉市| 高雄市| 河曲县| 广河县| 嘉峪关市| 岳阳县| 宁德市| 健康| 象州县| 阿尔山市| 靖州| 澄城县| 和林格尔县| 抚松县| 兴安县| 张北县| 古浪县| 克山县| 新化县| 石泉县| 芮城县| 嘉定区| 海阳市| 芦山县| 浦北县| 宣汉县| 贡嘎县| 惠州市| 定安县| 德保县| 普陀区| 达尔| 镇康县| 陆川县| 苏尼特左旗|