(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 }
二:被監聽數據,也就是規則網絡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 }
三:用於管理不同組件監聽器的監聽管理者。

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 }
四:各種組件監聽器的接口定義

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 }
五:各種監聽器的監聽事件的定義

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變動日記記錄的監聽器

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變動通知用戶的監聽器

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 }