规则引擎—Drools 语法第四天[学习笔记]

规则体基本结构 由第二天笔记可知

关键字描述
package包名,只限于逻辑上的管理,同一个包名下的查询或者函数可以直接调用
import用于导入类或者静态方法
global全局变量
function自定义函数
query查询
rule end规则体

 包名,导入类,规则体已经在之前的文章给大家说明了。

本章来讲述剩下的关键字。

1. global全局变量

global关键字可以用于规则文件中定义全局变量,他可以让程序应用的对象在规则文件中能够被访问。可以用来为规则文件提供数据或服务。

语法功能:global 对象类型 对象名称      如下图所示:

 

注意: 

1、如果对象类型为包装类型时,在一个规则中改变了global的值,那么只针对当前规则有效,对其他规则中的global不会有影响。可以理解为它是当前规则代码中的global副本,规则内部修改不会影响全局的使用。

2、如果对象类型为集合类型或JavaBean时,在一个规则中改变了global的值,对java代码和所有规则都有效。

代码演示: 

第一步:创建UserService类

 

第二步:编写DRL规则文件

第三步:编写测试单元

 2. query查询

query查询提供了一种查询working memory中符合约束条件的Fact对象的简单方法。它仅包含规则文件中的LHS部分,不用指定“when”和“then”部分并且以end结束。

基本语法: 

 示例:

 

代码演示: 

第一步:编写规则文件/resources/rules/query.drl

第二步:编写单元测试

3. function函数

function关键字用于在规则文件中定义函数,就相当于java类中的方法一样。可以在规则体中调用定义的函数。使用函数的好处是可以将业务逻辑集中放置在一个地方,根据需要可以对函数进行修改。 

基本语法:

 

示例:

 

 

代码演示: 

第一步:编写规则文件

第二步:编写测试单元

4.LHS加强 

前面我们已经知道了在规则体中的LHS部分是介于when和then之间的部分,主要用于模式匹配,只有匹配结果为true时,才会触发RHS部分的执行。

4.1 复合值限制 in/not in 

 复合值限制是指超过一种匹配值的限制条件,类似于SQL语句中的in关键字。Drools规则体中的LHS部分可以使用in或者not in进行复合值的匹配。具体语法结构如下:

示例:

  

4.2 条件元素eval 

eval用于规则体的LHS部分,并返回一个Boolean类型的值。语法结构如下:

示例: 

 

 

4.3 条件元素 not 

 not用于判断Working Memory中是否存在某个Fact对象,如果不存在则返回true,如果存在则返回false。语法结构如下:

示例:

  

4.4 条件元素 exists 

exists的作用与not相反,用于判断Working Memory中是否存在某个Fact对象,如果存在则返回true,不存在则返回false。语法结构如下:

 

示例:

 

 

可能有人会有疑问,我们前面在LHS部分进行条件编写时并没有使用exists也可以达到判断Working Memory中是否存在某个符合条件的Fact元素的目的,那么我们使用exists还有什么意义?

两者的区别:

当向Working Memory中加入多个满足条件的Fact对象时,

使用了exists的规则执行一次,

不使用exists的规则会执行多次,有几个对象执行几次。

5.RHS加强 

RHS部分是规则体的重要组成部分,当LHS部分的条件匹配成功后,对应的RHS部分就会触发执行。一般在RHS部分中需要进行业务处理。

在RHS部分Drools为我们提供了一个内置对象,名称就是drools。本小节我们来介绍几个drools对象提供的方法。

5.1 halt:halt方法的作用是立即终止后面所有规则的执行。

 

5.2 getWorkingMemory :getWorkingMemory方法的作用是返回工作内存对象。

 

 

5.3 getRule : 返回规则对象。

 

 

6.规则文件编码规范

我们在进行drl类型的规则文件编写时尽量遵循如下规范:

  • 所有的规则文件(.drl)应统一放在一个规定的文件夹中,如:/rules文件夹
  • 书写的每个规则应尽量加上注释。注释要清晰明了,言简意赅
  • 同一类型的对象尽量放在一个规则文件中,如所有Student类型的对象尽量放在一个规则文件中
  • 规则结果部分(RHS)尽量不要有条件语句,如if(...),尽量不要有复杂的逻辑和深层次的嵌套语句
  • 每个规则最好都加上salience属性,明确执行顺序
  • Drools默认dialect为"Java",尽量避免使用dialect "mvel"

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值