(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中利用观察者模式的更多相关文章

  1. 【Java】Lucene检索引擎详解

    基于Java的全文索引/检索引擎——Lucene Lucene不是一个完整的全文索引应用,而是是一个用Java写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能. L ...

  2. Java 日志记录规则

    Java 日志记录规则 规则一:日志是面向读者的 我们不应该让无价值的信息使日志文件变得乱糟糟,比如说完整打印所有的实体字段. 通常,实体名字和其逻辑关键字足以识别在表格中的一条记录了. 规则二:匹配 ...

  3. mysql截取函数常用方法 即mysql 字符串 截取-- - 最后带上java字符串截取规则比较

    常用的mysql截取函数有:left(), right(), substring(), substring_index() 下面来一一说明一下: 1.左截取left(str, length) 说明:l ...

  4. jQuery Validate 表单验证插件----通过name属性来关联字段来验证,改变默认的提示信息,将校验规则写到 js 代码中

    一.下载依赖包 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW  访问密码 f224 二. 添加一个另外一个插件jquery.validate.messages_cn.js. ...

  5. XAF实现运行时填加验证规则并保存到数据库中

    有几种方法可以用来声明一个验证规则.最常用的方法是使用对应的Attribute来定义.详见这里.验证模块还允许您通过在业务类实现 IRuleSource 接口定义自定义的验证规则的来源. IRuleS ...

  6. Android(java)学习笔记139:在TextView组件中利用Html插入文字或图片

    首先我们看看代码: 1.activity_main.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/r ...

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

    将校验规则写到控件中 <script src="../js/jquery.js" type="text/javascript"></scrip ...

  8. Java表达式转型规则

    Java表达式转型规则由低到高转换: 1.所有的byte,short,char型的值将被提升为int型: 2.如果有一个操作数是long型,计算结果是long型: 3.如果有一个操作数是float型, ...

  9. 在JAVA中利用public static final的组合方式对常量进行标识

    在JAVA中利用public static final的组合方式对常量进行标识(固定格式). 对于在构造方法中利用final进行赋值的时候,此时在构造之前系统设置的默认值相对于构造方法失效. 常量(这 ...

随机推荐

  1. uvm学习杂记

    一个类,只定义了而没有实例化,是没有任何意义的,但也有特殊情况,对于一个静态类,即其成员变量都是静态的,不实例化也可以正常使用: 类要想和DUT通信,不能在类里定义接口,会报错,只能在类里定义虚拟接口 ...

  2. 跳出弹窗页面禁止滚动(PC端和手机端)

    pc端如何实现 1.当弹窗显示时,为body元素添加属性:overflow:hidden, 当关闭弹窗时移除该属性即可2.在弹窗的div上设置 @scroll.stop.prevent 3.前端页面弹 ...

  3. MySQL性能优化之max_connections参数

    很多开发人员都会遇见”MySQL: ERROR 1040: Too many connections”的异常情况,造成这种情况的一种原因是访问量过高,MySQL服务器抗不住,这个时候就要考虑增加从服务 ...

  4. windows 安装python3.5启动报错:api-ms-win-crt-runtime-l1-1-0.dll丢失

    下载: api-ms-win-crt-runtime就是MFC的运行时环境的库,python在windows上编译也是用微软的visual studio C++编译的,底层也会用到微软提供的C++库和 ...

  5. c语言的按位运算符

    & 按位与 | 按位或 ^ 按位异或 1. 按位与运算 按位与运算符"&"是双目运算符.其功能是参与运算的两数各对应的二进位相与.只有对应的两个二进位均为1时,结果 ...

  6. oracle 中 dual 详解

    基本上oracle引入dual为的就是符合语法1. 我们先从名称来说,dual不是缩写词,本身就是完整的单词.dual名词意思是对数,做形容词时是指二重的,二元的.2. Oracle中的dual表是一 ...

  7. 本地存储(localStorage、sessionStorage、web Database)

    一.sessionStorage和localStorage sessionStorage和localStorage两种方法都是当用户在inPut文本框中输入内容并点击保存数据按钮时保存数据,点击读取数 ...

  8. GoLang激活码

    虽然行为不太好,但是购买的话实在是比较贵. 进入软件,Help-Register,选择License Server,输入 http://idea.youbbs.org 激活即可.

  9. AngularJS的思考

    AngularJS实践 什么是AngularJS AngularJS的核心理念是什么? 在我看来,Angualr的核心思想是:Template + Scope => HTML, Template ...

  10. java可变参数列表的实现

    参数就是我们调用一个方法时需要传入得数据,在方法中可能需要参数协助处理数据或者对参数进行解析处理以达到我们希望得到的数据和结果. 平常我们在写一个方法时,我们能确定需要传入什么样的参数以及参数的个数, ...