【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进行赋值的时候,此时在构造之前系统设置的默认值相对于构造方法失效. 常量(这 ...
随机推荐
- Spring AOP(4)
- fabric安装使用
可以使用pip安装fabric,注意使用pip 安装fabric时,一定要指定版本,不要安装2.0版本的,无论怎样都会提示没有api这样模块,所以指定安装 pip install fabric==1. ...
- jsp select multiple
//File: index.html<HTML> <HEAD> <TITLE>Submitting Multiple Selection Sel ...
- LeetCode第[26]题(Java):Remove Duplicates from Sorted Array 标签:Array
题目难度:Easy 题目: Given a sorted array, remove the duplicates in-place such that each element appear onl ...
- QQ钱包,微信,京东钱包,百度钱包,支付宝AGENT
微信Mozilla/5.0 (Linux; Android 7.0; LON-AL00 Build/HUAWEILON-AL00; wv) AppleWebKit/537.36 (KHTML, lik ...
- mysql数据库(一):建表与新增数据
一. 学习目标 理解什么是数据库,什么是表 怎样创建数据库和表(create) 怎样往表里插入数据(insert) 怎样修改表里的数据(update) 怎样删除数据库,表以及数据(delete) 二. ...
- VS2015自带v120的Platform Toolset
在VS2015安装组件时,勾选 “Windows 8.1 和 Windows Phone 8.0/8.1”下面的“工具和 Windows SDK”,将会安装Visual Studio 2013 (v1 ...
- 支付宝VIE的罪与罚
http://tech.ifeng.com/special/tusimple/alibaba/#_www_dt2 雅虎的杨致远.软银的孙正义,都曾是马云阿里巴巴创业路上的贵人,也都曾是相互信任的朋 ...
- windows平台下安装Beautiful Soup
1.Beautiful Soup 4.3.2 下载 2.下载完成后解压,放在Python的安装目录下,假设放到C:/Python 3.运行cmd,切换到C:/Python/Beautiful Soup ...
- Python之virtualenv沙盒环境
在开发Python应用程序的时候,系统安装的Python3只有一个版本:3.4.所有第三方的包都会被pip安装到Python3的site-packages目录下. 如果我们要同时开发多个应用程序,那这 ...