【java规则引擎】规则引擎RuleBase中利用观察者模式

(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
原文地址:https://www.cnblogs.com/shangxiaofei/p/6381467.html