【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

 

时间: 2024-07-30 23:01:44

【java规则引擎】规则引擎RuleBase中利用观察者模式的相关文章

旗正规则引擎规则编辑指南

看到有人问,旗正规则引擎定位就是规则逻辑实现简易,业务员也可以执行,可是试用的时候,突然发现还是有些凌乱,规则编辑感觉还是有点繁琐啊.那我说,方法还是没对路,接下来,我来献上指南. 规则包开发 通过"开始-->程序-->旗正商业规则定制平台->规则配置器"启动规则配置器.启动后, 关闭欢迎首页, 进入到缺省的开发工作空间. 通过规则配置器的测试步骤包括创建工程.创建规则包.定义对象库.定义规则.发布规则包.测试规则包.创建web页面.web方式测试规则包 以下分别讲述

Java操作FreeMarker模板引擎的基本用法示例小结_Android

FreeMarker 是一个采用 Java 开发的模版引擎,是一个基于模版生成文本的通用工具. 它被设计用来生成 HTML Web 页面,特别是基于 MVC 模式的应用程序.虽然使用FreeMarker需要具有一些编程的能力,但通常由 Java 程序准备要显示的数据,由 FreeMarker 生成页面,并通过模板显示准备的数据. http://freemarker.org/ public void process(String template, Map<String, ?> data) th

Java操作FreeMarker模板引擎的基本用法示例小结

FreeMarker 是一个采用 Java 开发的模版引擎,是一个基于模版生成文本的通用工具. 它被设计用来生成 HTML Web 页面,特别是基于 MVC 模式的应用程序.虽然使用FreeMarker需要具有一些编程的能力,但通常由 Java 程序准备要显示的数据,由 FreeMarker 生成页面,并通过模板显示准备的数据. http://freemarker.org/ public void process(String template, Map<String, ?> data) th

jQuery Validate 验证,校验规则写在控件中的具体实例

 本篇文章主要是对jQuery Validate 验证,校验规则写在控件中的具体实例进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 将校验规则写到控件中    代码如下: <script src="../js/jquery.js" type="text/javascript"></script> <script src="../js/jquery.validate.js" type="text/j

第三方dll文件-Java中利用jawin调用dll文件,invoke的参数问题

问题描述 Java中利用jawin调用dll文件,invoke的参数问题 各位大神: dll中的被调用方法如下: long WINAPI AutoOpenComPort(long* Port, unsigned char *ComAdr, unsigned char Baud,long *FrmHandle); 其中: Port:输出变量, ComAdr:输入/输出变量 Baud:输入变量 FrmHandle:输出变量 请问它的 msgBox.invoke(instructions, stack

如何在物理引擎的碰撞计算中得到碰撞作用线?

问题描述 如何在物理引擎的碰撞计算中得到碰撞作用线?初次接触制作物理引擎,看了一本叫做<游戏开发物理学>的书,这本书关于公式给的很好但是要知道碰撞作用线,就是碰撞时撞击的边的垂线,苦思不知道怎么求,希望能给出算法步骤或原理,谢了. 解决方案 解决方案二:没做过碰撞处理,帮你顶解决方案三:顶求帮助啊...有急用.解决方案四:碰撞边的过碰撞点的中垂线,和物体碰撞速度方向夹角的另一边的相同夹角的逆向方向,复杂一点要计算能量损失和摩擦损失的角度,以及碰撞边的非平滑情况还有运动物体的角度,但是基本来说,

java导出PDF文件,在程序中利用IE浏览器点击下载,是正确的后缀为PDF的文件;而在谷歌浏览器中,点击导出,导出的是后缀为.action的文件

问题描述 java导出PDF文件,在程序中利用IE浏览器点击下载,是正确的后缀为PDF的文件:而在谷歌浏览器中,点击导出,导出的是后缀为.action的文件,貌似是不支持谷歌浏览器啊?那位大哥遇到过啊?!case2:ServletOutputStreamouputStream=getResponse().getOutputStream();getResponse().setContentType("application/pdf");StringfileName2=newString(

Java中利用散列表实现股票行情的查询(转)

Java中利用散列表实现股票行情的查询 建设银行云南省保山地区分行 杨绍方 ---- 在java中,提供了一个散列表类Hashtable,利用该类,我们可以按照特定的方式来存储数据,从而达到快速检索的目的.本文以查询股票的收盘数据为例,详细地说明java中散列表的使用方法.一.散列表的原理 ---- 散列表,又称为哈希表,是线性表中一种重要的存储方式和检索方法.在散列表中,可以对节点进行快速检索.散列表算法的基本思想是:由结点的关键码值决定结点的存储地址,即以关键码值k为自变量,通过一定的函数关

如何使用规则来限制数据表中字段的有限范围

问题描述 问题是:如何使用规则来限制数据表中字段的有限范围 解决方案 解决方案二:使用rule或者CHECK约束都可以达到你要的效果!建议在数据库层实施!如果是在界面层,建议定义属性检查.解决方案三:能不能详细的介绍一下啊,我不太清楚唉,谢谢解决方案四:CHECK约束列可以有任意多个CHECK约束,并且约束条件中可以包含用AND和OR组合起来的多个逻辑表达式.列上的多个CHECK约束按创建顺序进行验证.搜索条件必须取值为布尔表达式,并且不能引用其它表.列级CHECK约束只能引用被约束的列,表级C