(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. Xshell 或者 Xftp 突然连不上阿里云

    今天突然发现使用xshell 远程连接不上阿里云,废了好大的劲,才明白的差不多.只要不出意外有以下几种情况:1.安全组中有没有你需要连接的端口,2.防火墙是否关闭,3.端口是否开放权限,4.是否安装了 ...

  2. v4l2中的多流机制

    一直在搞camera,对v4l2也比较熟悉了,今天写文章说点自己的看法 对于v4l2,对多流的支持是比较弱的,只是一个流.但现在的camera 硬件,能支持多个流同事工作,所以又必要对v4l2的api ...

  3. mysql DATE_FORMAT 年月日时分秒格式化

    SELECT DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s')

  4. Moore majority vote algorithm(摩尔投票算法)

    Boyer-Moore majority vote algorithm(摩尔投票算法) 简介 Boyer-Moore majority vote algorithm(摩尔投票算法)是一种在线性时间O( ...

  5. Makefile文件应用——simple项目

    学习资料 本文主要参考资料:驾驭Makefile(李云).pdf 原理 (1)最基本的语法 targets: prerequisites command targets是目标,prerequisite ...

  6. Codeforces Round #447 (Div. 2) C 构造

    现在有一个长度为n的数列 n不超过4000 求出它的gcd生成set 生成方式是对<i,j> insert进去(a[i] ^ a[i+1] ... ^a[j]) i<=j 然而现在给 ...

  7. Android -- SQLite 数据库创建,增删改查,事务处理

    1. 概述 在Android平台上,集成了一个嵌入式关系型数据库-SQLite,SQLite3支持 NULL.INTEGER.REAL(浮点数字).TEXT(字符串文本)和BLOB(二进制对象)数据类 ...

  8. Search in Rotated Sorted Array, 查找反转有序序列。利用二分查找的思想。反转序列。

    问题描述:一个有序序列经过反转,得到一个新的序列,查找新序列的某个元素.12345->45123. 算法思想:利用二分查找的思想,都是把要找的目标元素限制在一个小范围的有序序列中.这个题和二分查 ...

  9. MINA学习汇总

    MINA学习汇总 Apache Mina Server 是一个网络通信应用框架,用于开发高性能和高可用性的网络应用程序.它主要是对基于TCP/IP.UDP/IP协议栈的通信框架(然,也可以提供JAVA ...

  10. 自己用java实现飞鸽传书 1 - 实现socket通信

    第一步: 建立服务端客户端,实现端到端通信.因为要传递文件,信号量较大,故使用TCP/IP协议. 服务端和客户端都要建立socket,而后通过socket进行通信.目前只实现服务端到客户端的单向通信. ...