【java规则引擎】规则引擎RuleBase中利用观察者模式
(1)当RuleBase中有规则添加或删除,利用观察者模式实现,一旦有变动,规则引擎其他组件也做出相应的改变。
(2)学习思想:当一个应用中涉及多个组件,为了实现易扩展,解耦思想。可以利用观察者模式实现。基于易变动的数据结构中加入监听者,监听者依据被监听者的变动动作,定义自己的动作。在监听者内部通知其他组件做出相应改变。实现面向对象的思想。组建之间实现了解藕。
一:被监听数据,也就是规则网络RuleBase的接口定义
package com.nonbankcard.commons.doorls.ruleBaseListern;
/**
* 定义一个核心数据的对象的接口
*
* @author sxf
*
*/
public interface RuleBase {
/**
* 添加一个规则
* @param rule
*/
public void addRule(String rule);
/**
* 删除一个规则
* @param rule
*/
public void removeRule(String rule);
/**
* 修改一个规则
* @param rule
*/
public void updateRule(String rule); }
二:被监听数据,也就是规则网络RuleBase的实现定义
package com.nonbankcard.commons.doorls.ruleBaseListern;
/**
* 真正的RuleBase对象
* @author sxf
*
*/
public class ReootoRuleBase implements RuleBase{ private RuleBaseListernSupport support; @Override
public void addRule(String rule) {
support.addRule(rule);
System.out.println("ReootoRuleBase.addRule(添加规则的操作)"); } @Override
public void removeRule(String rule) {
support.removeRule(rule);
System.out.println("ReootoRuleBase.removeRule(规则删除的操作)");
} @Override
public void updateRule(String rule) { } }
三:用于管理不同组件监听器的监听管理者。
package com.nonbankcard.commons.doorls.ruleBaseListern; import java.util.List; /**
* 管理ruleBase某些动作的事件监听管理
*
* (1)当ruleBase对象发生某个动作,都要告诉监听管理器,监听管理器做相应的处理
* (2)监听管理者,包括监听器的行为都是依据RuleBase的动作为定。
* @author sxf
*
*/
public class RuleBaseListernSupport { /**
* 事件支持的监听器集合
*/
private List<RuleBaseEventListern> listeners; /**
* 规则添加监听器发布事件
* @param rule
*/
public void addRule(String rule) {
RuleBaseEvent event=new RuleBaseEvent(rule);
for(RuleBaseEventListern listener:listeners){
listener.ruleBaseAddRule(event);
}
} /**
* 规则删除监听器发布事件
* @param rule
*/
public void removeRule(String rule){
RuleBaseEvent event=new RuleBaseEvent(rule);
for(RuleBaseEventListern listener:listeners){
listener.ruleBaseRemove(event);
}
} public List<RuleBaseEventListern> getListeners() {
return listeners;
} public void setListeners(List<RuleBaseEventListern> listeners) {
this.listeners = listeners;
} }
四:各种组件监听器的接口定义
package com.nonbankcard.commons.doorls.ruleBaseListern;
/**
* (1)监听器接口,将来不同的组件监听RuleBase的变动,都可以声明一个监听器,实现该接口
* (2)将监听器注册到RuleBase的监听管理者内部
* @author sxf
*
*/
public interface RuleBaseEventListern { /**
* 一个规则被添加
* @param event
*/
public void ruleBaseAddRule(RuleBaseEvent event);
/**
* 一个规则被删除
* @param event
*/
public void ruleBaseRemove(RuleBaseEvent event); }
五:各种监听器的监听事件的定义
package com.nonbankcard.commons.doorls.ruleBaseListern;
/**
* ruleBase的监听事件
* @author sxf
*
*/
public class RuleBaseEvent { private Object source; public RuleBaseEvent(Object source) {
super();
this.source = source;
} public Object getSource() {
return source;
} public void setSource(Object source) {
this.source = source;
} }
六:RuleBase变动日记记录的监听器
package com.nonbankcard.commons.doorls.ruleBaseListern;
/**
* ruleBase改变记录日志的监听器
* @author sxf
*
*/
public class LogRecordRuleBaseListener implements RuleBaseEventListern { @Override
public void ruleBaseAddRule(RuleBaseEvent event) {
String rule=(String) event.getSource();
System.out.println("LogRecordRuleBaseListener.ruleBaseAddRule(一个规则被添加===>"+rule); } @Override
public void ruleBaseRemove(RuleBaseEvent event) {
String ruleString=(String) event.getSource();
System.out.println("LogRecordRuleBaseListener.enclosing_method(一个规则被删除)"+ruleString); } }
七:RuleBase变动通知用户的监听器
package com.nonbankcard.commons.doorls.ruleBaseListern;
public class NoticeSystemRuleBaseListener implements RuleBaseEventListern {
@Override
public void ruleBaseAddRule(RuleBaseEvent event) {
String rule=(String) event.getSource();
System.out.println("NoticeSystemRuleBaseListener.ruleBaseRemove(通知用户添加一个规则)"+rule);
}
@Override
public void ruleBaseRemove(RuleBaseEvent event) {
String rule=(String) event.getSource();
System.out.println("NoticeSystemRuleBaseListener.ruleBaseRemove(通知用户删除了一个规则)"+rule);
}
}
【java规则引擎】规则引擎RuleBase中利用观察者模式的更多相关文章
- 【Java】Lucene检索引擎详解
基于Java的全文索引/检索引擎——Lucene Lucene不是一个完整的全文索引应用,而是是一个用Java写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能. L ...
- Java 日志记录规则
Java 日志记录规则 规则一:日志是面向读者的 我们不应该让无价值的信息使日志文件变得乱糟糟,比如说完整打印所有的实体字段. 通常,实体名字和其逻辑关键字足以识别在表格中的一条记录了. 规则二:匹配 ...
- mysql截取函数常用方法 即mysql 字符串 截取-- - 最后带上java字符串截取规则比较
常用的mysql截取函数有:left(), right(), substring(), substring_index() 下面来一一说明一下: 1.左截取left(str, length) 说明:l ...
- jQuery Validate 表单验证插件----通过name属性来关联字段来验证,改变默认的提示信息,将校验规则写到 js 代码中
一.下载依赖包 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW 访问密码 f224 二. 添加一个另外一个插件jquery.validate.messages_cn.js. ...
- XAF实现运行时填加验证规则并保存到数据库中
有几种方法可以用来声明一个验证规则.最常用的方法是使用对应的Attribute来定义.详见这里.验证模块还允许您通过在业务类实现 IRuleSource 接口定义自定义的验证规则的来源. IRuleS ...
- Android(java)学习笔记139:在TextView组件中利用Html插入文字或图片
首先我们看看代码: 1.activity_main.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/r ...
- jQuery Validate 验证,校验规则写在控件中的具体例子
将校验规则写到控件中 <script src="../js/jquery.js" type="text/javascript"></scrip ...
- Java表达式转型规则
Java表达式转型规则由低到高转换: 1.所有的byte,short,char型的值将被提升为int型: 2.如果有一个操作数是long型,计算结果是long型: 3.如果有一个操作数是float型, ...
- 在JAVA中利用public static final的组合方式对常量进行标识
在JAVA中利用public static final的组合方式对常量进行标识(固定格式). 对于在构造方法中利用final进行赋值的时候,此时在构造之前系统设置的默认值相对于构造方法失效. 常量(这 ...
随机推荐
- Python引用多个模块,调用模块中的函数时,要注意的地方
转自:http://blog.csdn.net/yjk13703623757/article/details/70237463 python模块是”从下到上”导入(import)的. 例如: a.py ...
- Django QuerySet API
https://docs.djangoproject.com/en/2.1/ref/models/querysets/
- 利用Metasploit进行Linux提权
利用Metasploit进行Linux提权 Metasploit 拥有msfpayload 和msfencode 这两个工具,这两个工具不但可以生成exe 型后门,一可以生成网页脚本类型的webshe ...
- Spring 模块
- mysql查询结果乱码
1.查询数据库结果乱码 mysql,; +-----------+-------------------------------------------------------------+ | do ...
- windchill系统——导航器v1.0:思维导图
总图 思维导图图片链接 http://www.edrawsoft.cn/viewer/public/s/7b3fc783493788
- aliyun阿里云Maven仓库地址——加速你的maven构建 - 转载
maven仓库用过的人都知道,国内有多么的悲催.还好有比较好用的镜像可以使用,尽快记录下来.速度提升100倍. http://maven.aliyun.com/nexus/#view-reposito ...
- UOJ34 多项式乘法(非递归版)
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- Kubernetes学习整理
修改镜像仓库 官方提供的时google源,显然是无法使用的.这里需要改成国内的源 cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kube ...
- win7 vmware虚拟机上网设置
1.上网方式设成HOST-ONLY 2.将主机的网络共享VMnet1(完成第一步设置后,VMware自动分配虚拟网络VMnet1) 3.win7下查看VMnet1网络ip 4.根据3查看的IP地址在v ...