【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 }

二:被监听数据,也就是规则网络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 }

时间: 2024-10-03 21:53:24

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

简说规则引擎在促销返利中的应用

大型生产型企业销售渠道的建设,一般都采用代理商政策.根据地区.产品等情况,设立不同级别的代理商,不同地区.不同级别代理商有着不同的促销返利政策,也需根据企业.市场现状对促销政策进行调整,另一方面,也需要对促销政策进行风控管理,以防止不法分子利用政策空隙牟取利益. 生产型企业需要每个季度,根据最新的促销政策,需要计算每个代理商的返点金额.这项工作目前基本上都是采用手工采用Excel进行计算,效率比较低下,当达到一定数量级数据,手工计算不能及时进行计算进行返利,对企业造成一定的影响. 如果要将返点计

旗正规则引擎规则编辑

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

jQuery表单验证插件----利用jquery.metadata.js将校验规则写到控件中

一.下载依赖包 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW  访问密码 f224 二. 添加一个另外一个插件jquery.metadata.js 并把校验规则写在控件里面. 三.需要改写触发校验的方式. $("#commentForm").validate({meta: "validate"}); 四.详细代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transit

【Java】Lucene检索引擎详解

基于Java的全文索引/检索引擎——Lucene Lucene不是一个完整的全文索引应用,而是是一个用Java写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能. Lucene的作者:Lucene的贡献者Doug Cutting是一位资深全文索引/检索专家,曾经是V-Twin搜索引擎(Apple的Copland操作系统的成就之一)的主要开发者,后在Excite担任高级系统架构设计师,目前从事于一些INTERNET底层架构的研究.他贡献出的Lucene的目标是为各

java调用javascript :js引擎rhino

java调用javascript :js引擎rhino JavaJavaScriptEclipse脚本SQL 前段时间,在浏览javaeye论坛,看见有人征集如何在java中运行数学表达式.结果方案五花八门:1.jakarta commons JEXL. 2.Beanshell3.Java Math Expression Parser jep 4.parse combinator jparsec 5.jdk 6.0的 script6.利用SQL 7.自己写语法分析如果自己写语法分析,没有个200

java开发命名规则

1.文件 1.属性文件后缀为properties,并且符合java中i18n的规范:   2.对于各产品模块自己的配置文件必须放置在自己模块的conf目录下:   3.文件的命名需要有一定的意义,尽量简短,名称符合操作系统的要求且必须为英文或汉语拼音组成,文件名称不能存在空格,对于普通的文件单词与单词之间采用下 滑线进行. 2.命名规范   2.1基本规则 1.字符集在26个英文字母.0到9的阿拉伯数字和下划线之中.Java中类.字段.方法.变量.常量尽量用字母表达,没有特别的理由不能用任何的其

Java表达式转型规则

Java表达式转型规则由低到高转换: 1.所有的byte,short,char型的值将被提升为int型: 2.如果有一个操作数是long型,计算结果是long型: 3.如果有一个操作数是float型,计算结果是float型: 4.如果有一个操作数是double型,计算结果是double型: 5.被fianl修饰的变量不会自动改变类型,当2个final修饰相操作时,结果会根据左边变量的类型而转化.

Android 中利用WebViewJavascriptBridge 实现js和java的交互(一)

此文出自:http://blog.csdn.net/sk719887916/article/details/47189607 ,skay 博客 按安卓开发目前现状来说,开发者大部分时间还是花在UI的屏幕适配上,使用原生控件开发成本已不是那么理想,鉴于很多项目和ios基于一致的ui界面,至使安卓UI开发成本花费更大的代价,因此目前结合Html5和原生控件是解决UI适配的一种很好的选择,处于APP性能也会用java和native层进行结合.不管是哪种结合,其实原理都差不多,只要按照它的协议来,是很容

java中利用反射机制绕开编译器对泛型的类型限制

首先看下面这个例子 public static void main(String[] args) { ArrayList<Integer> al1 = new ArrayList<Integer>(); al1.add(1); ArrayList<String> al2 = new ArrayList<String>(); al2.add("hello"); //int型链表和string型链表,结果为true System.out.pr