(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. Spring AOP(4)

  2. fabric安装使用

    可以使用pip安装fabric,注意使用pip 安装fabric时,一定要指定版本,不要安装2.0版本的,无论怎样都会提示没有api这样模块,所以指定安装 pip install fabric==1. ...

  3. jsp select multiple

    //File: index.html<HTML>    <HEAD>        <TITLE>Submitting Multiple Selection Sel ...

  4. 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 ...

  5. QQ钱包,微信,京东钱包,百度钱包,支付宝AGENT

    微信Mozilla/5.0 (Linux; Android 7.0; LON-AL00 Build/HUAWEILON-AL00; wv) AppleWebKit/537.36 (KHTML, lik ...

  6. mysql数据库(一):建表与新增数据

    一. 学习目标 理解什么是数据库,什么是表 怎样创建数据库和表(create) 怎样往表里插入数据(insert) 怎样修改表里的数据(update) 怎样删除数据库,表以及数据(delete) 二. ...

  7. VS2015自带v120的Platform Toolset

    在VS2015安装组件时,勾选 “Windows 8.1 和 Windows Phone 8.0/8.1”下面的“工具和 Windows SDK”,将会安装Visual Studio 2013 (v1 ...

  8. 支付宝VIE的罪与罚

    http://tech.ifeng.com/special/tusimple/alibaba/#_www_dt2   雅虎的杨致远.软银的孙正义,都曾是马云阿里巴巴创业路上的贵人,也都曾是相互信任的朋 ...

  9. windows平台下安装Beautiful Soup

    1.Beautiful Soup 4.3.2 下载 2.下载完成后解压,放在Python的安装目录下,假设放到C:/Python 3.运行cmd,切换到C:/Python/Beautiful Soup ...

  10. Python之virtualenv沙盒环境

    在开发Python应用程序的时候,系统安装的Python3只有一个版本:3.4.所有第三方的包都会被pip安装到Python3的site-packages目录下. 如果我们要同时开发多个应用程序,那这 ...