(1)当RuleBase中有规则添加或删除,利用观察者模式实现,一旦有变动,规则引擎其他组件也做出相应的改变。
(2)学习思想:当一个应用中涉及多个组件,为了实现易扩展,解耦思想。可以利用观察者模式实现。基于易变动的数据结构中加入监听者,监听者依据被监听者的变动动作,定义自己的动作。在监听者内部通知其他组件做出相应改变。实现面向对象的思想。组建之间实现了解藕。
一:被监听数据,也就是规则网络RuleBase的接口定义
![](https://i-blog.csdnimg.cn/blog_migrate/5f94c2fecb4ccb2f76f50c965d122407.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/50828477840f9be8f01bb82af691c7d1.gif)
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 }
二:被监听数据,也就是规则网络RuleBase的实现定义
![](https://i-blog.csdnimg.cn/blog_migrate/5f94c2fecb4ccb2f76f50c965d122407.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/50828477840f9be8f01bb82af691c7d1.gif)
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 }
三:用于管理不同组件监听器的监听管理者。
![](https://i-blog.csdnimg.cn/blog_migrate/5f94c2fecb4ccb2f76f50c965d122407.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/50828477840f9be8f01bb82af691c7d1.gif)
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 }
四:各种组件监听器的接口定义
![](https://i-blog.csdnimg.cn/blog_migrate/5f94c2fecb4ccb2f76f50c965d122407.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/50828477840f9be8f01bb82af691c7d1.gif)
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 }
五:各种监听器的监听事件的定义
![](https://i-blog.csdnimg.cn/blog_migrate/5f94c2fecb4ccb2f76f50c965d122407.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/50828477840f9be8f01bb82af691c7d1.gif)
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 }
六:RuleBase变动日记记录的监听器
![](https://i-blog.csdnimg.cn/blog_migrate/5f94c2fecb4ccb2f76f50c965d122407.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/50828477840f9be8f01bb82af691c7d1.gif)
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 }
七:RuleBase变动通知用户的监听器
![](https://i-blog.csdnimg.cn/blog_migrate/5f94c2fecb4ccb2f76f50c965d122407.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/50828477840f9be8f01bb82af691c7d1.gif)
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 }