【java規則引擎】規則引擎RuleBase中利用觀察者模式

Love Lenka發表於2017-02-09

(1)當RuleBase中有規則新增或刪除,利用觀察者模式實現,一旦有變動,規則引擎其他元件也做出相應的改變。
(2)學習思想:當一個應用中涉及多個元件,為了實現易擴充套件,解耦思想。可以利用觀察者模式實現。基於易變動的資料結構中加入監聽者,監聽者依據被監聽者的變動動作,定義自己的動作。在監聽者內部通知其他元件做出相應改變。實現物件導向的思想。組建之間實現瞭解藕。

 

一:被監聽資料,也就是規則網路RuleBase的介面定義

 1 package com.nonbankcard.commons.doorls.ruleBaseListern;
 2 /**
 3  * 定義一個核心資料的物件的介面
 4  * 
 5  * @author sxf
 6  *
 7  */
 8 public interface RuleBase {
 9     /**
10      * 新增一個規則
11      * @param rule
12      */
13     public void addRule(String rule);
14     /**
15      * 刪除一個規則
16      * @param rule
17      */
18     public void removeRule(String rule);
19     /**
20      * 修改一個規則
21      * @param rule
22      */
23     public void updateRule(String rule);
24 
25 }
View Code

二:被監聽資料,也就是規則網路RuleBase的實現定義

 1 package com.nonbankcard.commons.doorls.ruleBaseListern;
 2 /**
 3  * 真正的RuleBase物件
 4  * @author sxf
 5  *
 6  */
 7 public class ReootoRuleBase  implements RuleBase{
 8     
 9     private RuleBaseListernSupport support;
10 
11     @Override
12     public void addRule(String rule) {
13         support.addRule(rule);
14         System.out.println("ReootoRuleBase.addRule(新增規則的操作)");
15         
16     }
17 
18     @Override
19     public void removeRule(String rule) {
20         support.removeRule(rule);
21         System.out.println("ReootoRuleBase.removeRule(規則刪除的操作)");
22     }
23 
24     @Override
25     public void updateRule(String rule) {
26     
27         
28     }
29 
30     
31 }
View Code

三:用於管理不同元件監聽器的監聽管理者。

 1 package com.nonbankcard.commons.doorls.ruleBaseListern;
 2 
 3 import java.util.List;
 4 
 5 
 6 /**
 7  * 管理ruleBase某些動作的事件監聽管理
 8  * 
 9  * (1)當ruleBase物件發生某個動作,都要告訴監聽管理器,監聽管理器做相應的處理
10  * (2)監聽管理者,包括監聽器的行為都是依據RuleBase的動作為定。
11  * @author sxf
12  *
13  */
14 public class RuleBaseListernSupport {
15     
16     /**
17      * 事件支援的監聽器集合
18      */
19     private List<RuleBaseEventListern> listeners;
20 
21     /**
22      * 規則新增監聽器釋出事件
23      * @param rule
24      */
25     public void addRule(String rule) {
26         RuleBaseEvent event=new RuleBaseEvent(rule);
27         for(RuleBaseEventListern listener:listeners){
28             listener.ruleBaseAddRule(event);
29         }
30     }
31 
32     
33     /**
34      * 規則刪除監聽器釋出事件
35      * @param rule
36      */
37     public void removeRule(String rule){
38         RuleBaseEvent event=new RuleBaseEvent(rule);
39         for(RuleBaseEventListern listener:listeners){
40             listener.ruleBaseRemove(event);
41         }
42     }
43 
44 
45     public List<RuleBaseEventListern> getListeners() {
46         return listeners;
47     }
48 
49 
50     public void setListeners(List<RuleBaseEventListern> listeners) {
51         this.listeners = listeners;
52     }
53     
54     
55     
56 }
View Code

四:各種元件監聽器的介面定義

 1 package com.nonbankcard.commons.doorls.ruleBaseListern;
 2 /**
 3  * (1)監聽器介面,將來不同的元件監聽RuleBase的變動,都可以宣告一個監聽器,實現該介面
 4  * (2)將監聽器註冊到RuleBase的監聽管理者內部
 5  * @author sxf
 6  *
 7  */
 8 public interface RuleBaseEventListern {
 9     
10     /**
11      * 一個規則被新增
12      * @param event
13      */
14     public void ruleBaseAddRule(RuleBaseEvent event);
15     /**
16      * 一個規則被刪除
17      * @param event
18      */
19     public void ruleBaseRemove(RuleBaseEvent event);
20 
21 }
View Code

五:各種監聽器的監聽事件的定義

 1 package com.nonbankcard.commons.doorls.ruleBaseListern;
 2 /**
 3  * ruleBase的監聽事件
 4  * @author sxf
 5  *
 6  */
 7 public class RuleBaseEvent {
 8 
 9     private Object source;
10 
11     public RuleBaseEvent(Object source) {
12         super();
13         this.source = source;
14     }
15 
16     public Object getSource() {
17         return source;
18     }
19 
20     public void setSource(Object source) {
21         this.source = source;
22     }
23     
24     
25 }
View Code

六:RuleBase變動日記記錄的監聽器

 1 package com.nonbankcard.commons.doorls.ruleBaseListern;
 2 /**
 3  * ruleBase改變記錄日誌的監聽器
 4  * @author sxf
 5  *
 6  */
 7 public class LogRecordRuleBaseListener implements RuleBaseEventListern {
 8 
 9     @Override
10     public void ruleBaseAddRule(RuleBaseEvent event) {
11         String rule=(String) event.getSource();
12         System.out.println("LogRecordRuleBaseListener.ruleBaseAddRule(一個規則被新增===>"+rule);
13         
14     }
15 
16     @Override
17     public void ruleBaseRemove(RuleBaseEvent event) {
18         String ruleString=(String) event.getSource();
19         System.out.println("LogRecordRuleBaseListener.enclosing_method(一個規則被刪除)"+ruleString);
20         
21     }
22     
23     
24 
25 }
View Code

七:RuleBase變動通知使用者的監聽器

 1 package com.nonbankcard.commons.doorls.ruleBaseListern;
 2 
 3 public class NoticeSystemRuleBaseListener implements RuleBaseEventListern {
 4 
 5     @Override
 6     public void ruleBaseAddRule(RuleBaseEvent event) {
 7         String rule=(String) event.getSource();
 8         System.out.println("NoticeSystemRuleBaseListener.ruleBaseRemove(通知使用者新增一個規則)"+rule);
 9         
10     }
11 
12     @Override
13     public void ruleBaseRemove(RuleBaseEvent event) {
14         String rule=(String) event.getSource();
15         System.out.println("NoticeSystemRuleBaseListener.ruleBaseRemove(通知使用者刪除了一個規則)"+rule);
16     }
17 
18 }
View Code

 

相關文章