《Drools7.0.0.Final规则引擎教程》第4章 4.6 结果条件
结果条件
在Java中,如果有重复的代码我们会考虑进行重构,抽取公共方法或继承父类,以减少相同的代码在多处出现,达到代码的最优管理和不必要的麻烦。Drools同样提供了类似的功能。下面我们以实例来逐步说明。
像下面最原始的两条规则,有相同的业务判断,也有不同的地方:
package com.rules.conditional
import com.secbro.drools.model.Customer;
import com.secbro.drools.model.Car;
rule "conditional1:Give 10% discount to customers older than 60"
agenda-group "conditional1"
when
$customer : Customer( age > 60 )
then
modify($customer) { setDiscount( 0.1 ) };
System.out.println("Give 10% discount to customers older than 60");
end
rule "conditional1:Give free parking to customers older than 60"
agenda-group "conditional1"
when
$customer : Customer( age > 60 )
$car : Car ( owner == $customer )
then
modify($car) { setFreeParking( true ) };
System.out.println("Give free parking to customers older than 60");
end
现在Drools提供了extends特性,也就是一个规则可以继承另外一个规则,并获得其约束条件。改写之后执行效果相同,代码如下:
package com.rules.conditional
import com.secbro.drools.model.Customer;
import com.secbro.drools.model.Car;
rule "conditional2:Give 10% discount to customers older than 60"
agenda-group "conditional2"
when
$customer : Customer( age > 60 )
then
modify($customer) { setDiscount( 0.1 ) };
System.out.println("conditional2:Give 10% discount to customers older than 60");
end
rule "conditional2:Give free parking to customers older than 60"
extends "conditional2:Give 10% discount to customers older than 60"
agenda-group "conditional2"
when
$car : Car ( owner == $customer )
then
modify($car) { setFreeParking( true ) };
System.out.println("conditional2:Give free parking to customers older than 60");
end
我们可以看到上面使用了extends,后面紧跟的是另外一条规则的名称。这样,第二条规则同时拥有了第一条规则的约束条件。只需要单独写此条规则自身额外需要的约束条件即可。那么,现在是否是最优的写法吗?当然不是,还可以将两条规则合并成一条来规则。这就用到了do和标记。
package com.rules.conditional
import com.secbro.drools.model.Customer;
import com.secbro.drools.model.Car;
rule "conditional3:Give 10% discount to customers older than 60"
agenda-group "conditional3"
when
$customer : Customer( age > 60 )
do[giveDiscount]
$car : Car(owner == $customer)
then
modify($car) { setFreeParking(true) };
System.out.println("conditional3:Give free parking to customers older than 60");
then[giveDiscount]
modify($customer){
setDiscount(0.1)
};
System.out.println("conditional3:Give 10% discount to customers older than 60");
end
在then中标记了giveDiscount处理操作,在when中用do来调用标记的操作。这样也当第一个约束条件判断完成之后,就执行标记giveDiscount中的操作,然后继续执行Car的约束判断,通过之后执行默认的操作。
在then中还可以添加一些判断来执行标记的操作,这样就不必每次都执行do操作,而是每当满足if条件之后才执行:
package com.rules.conditional
import com.secbro.drools.model.Customer;
import com.secbro.drools.model.Car;
rule "conditional4:Give 10% discount to customers older than 60"
agenda-group "conditional4"
when
$customer : Customer( age > 60 )
if(type == "Golden") do[giveDiscount]
$car : Car(owner == $customer)
then
modify($car) { setFreeParking(true) };
System.out.println("conditional4:Give free parking to customers older than 60");
then[giveDiscount]
modify($customer){
setDiscount(0.1)
};
System.out.println("conditional4:Give 10% discount to customers older than 60");
end
同时,还可以通过break来中断后续的判断。
package com.rules.conditional
import com.secbro.drools.model.Customer;
import com.secbro.drools.model.Car;
rule "conditional5:Give 10% discount to customers older than 60"
agenda-group "conditional5"
when
$customer : Customer( age > 60 )
if(type == "Golden") do[giveDiscount10]
else if (type == "Silver") break[giveDiscount5]
$car : Car(owner == $customer)
then
modify($car) { setFreeParking(true) };
System.out.println("conditional5:Give free parking to customers older than 60");
then[giveDiscount10]
modify($customer){
setDiscount(0.1)
};
System.out.println("giveDiscount10:Give 10% discount to customers older than 60");
then[giveDiscount5]
modify($customer){
setDiscount(0.05)
};
System.out.println("giveDiscount5:Give 10% discount to customers older than 60");
end
以上规则的执行测试代码如下,执行结果可自行尝试,源代码已经存放在GitHub:https://github.com/secbr/drools。
后语
此系列课程持续更新中,QQ群:593177274(可扫描左上侧栏目二维码),欢迎大家加入讨论。点击链接关注《Drools博客专栏》。由于Drools资料较少,教程编写不易,每篇博客都亲身实践编写demo。如果对你有帮助也欢迎赞赏(微信)! 也是对原创的最大支持!
《Drools7.0.0.Final规则引擎教程》第4章 4.6 结果条件的更多相关文章
- 《Drools7.0.0.Final规则引擎教程》Springboot+规则重新加载
在<Drools7.0.0.Final规则引擎教程>之Springboot集成中介绍了怎样将Drools与Springboot进行集成,本篇博客介绍一下集成之后,如何实现从数据库读取规则并 ...
- 《Drools7.0.0.Final规则引擎教程》第3章 3.1 Hello World 实例
3.1 Hello World 实例 在上一章中介绍了Drools5x版本中规则引擎使用的实例,很明显在Drools7中KnowledgeBase类已经标注为"@Deprecated&quo ...
- 《Drools7.0.0.Final规则引擎教程》第2章 追溯Drools5的使用
2.1 Drools5简述 上面已经提到Drools是通过规则编译.规则收集和规则的执行来实现具体功能的.Drools5提供了以下主要实现API: KnowledgeBuilder Knowledge ...
- 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第3章 3.2 KIE API解析
转载至:https://blog.csdn.net/wo541075754/article/details/75004575 3.2.4 KieServices 该接口提供了很多方法,可以通过这些方法 ...
- 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第3章 3.2 KIE概念&FACT对象
转载:https://blog.csdn.net/wo541075754/article/details/74943236 3.2.1 什么是KIE KIE(Knowledge Is Everythi ...
- 《Drools7.0.0.Final规则引擎教程》第3章 3.2 KIE API解析
3.2.4 KieServices 该接口提供了很多方法,可以通过这些方法访问KIE关于构建和运行的相关对象,比如说可以获取KieContainer,利用KieContainer来访问KBase和KS ...
- 《Drools7.0.0.Final规则引擎教程》第3章 3.2 KIE概念&FACT对象
3.2.1 什么是KIE KIE(Knowledge Is Everything),知识就是一切的简称.JBoss一系列项目的总称,在<Drools使用概述>章节已经介绍了KIE包含的大部 ...
- 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第4章 4.1 规则文件
转载至:https://blog.csdn.net/wo541075754/article/details/75150267 一个标准的规则文件的格式为已“.drl”结尾的文本文件,因此可以通过记事本 ...
- 《Drools7.0.0.Final规则引擎教程》第4章 注释&错误信息
注释 像Java开发语言一样,Drools文件中也可以添加注释.注释部分Drools引擎是会将其忽略调的.单行注释使用"//",示例如下: rule "Testing C ...
- 《Drools7.0.0.Final规则引擎教程》第4章 4.4 约束(Pattern的一部分)
4.4.3 约束(Pattern的一部分) 前面我们已经介绍了条件约束在Pattern中位置了,那么什么是条件约束呢?简单来说就是一个返回true或者false的表达式,比如下面的5小于6,就是一个约 ...
随机推荐
- snapshot与release
总结自:https://www.jianshu.com/p/084fd2408d9a 这两个概念是用于描述jar包,jar包提供给其他系统作为依赖. 1. snapshot版本代表不稳定.尚处于开发中 ...
- 20145302张薇 《Java程序设计》第二周学习总结
20145302张薇 <Java程序设计>第一周学习总结 教材学习内容总结 第三章 第三章讲的是基本类型,变量,运算符和基本条件语句. 基本类型分为: 整数:short(2 byte),i ...
- center os7.2 apache+php+mysql环境配置并设置https访问
本人阿里云购买的center os7.2系统,小程序只支持https,因此需要配置https 安装apache yum -y install httpd systemctl start httpd a ...
- Mac中MacPorts安装和使用 MacPorts简介
MacPorts,曾经叫做DarwinPorts,是一个软件包管理系统,用来简化Mac OS X和Darwin操作系统上软件的安装.它是一个用来简化自由软件/开放源代码软件的安装的自由/开放源代码项目 ...
- shell内置命令eval的具有什么作用
答:把变量中的内容当成命令来执行
- win10家庭版的defender注册表关闭和开启
关闭方法: 打开“命令提示符(管理员)”,然后输入: reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defe ...
- 微服务(一)eureka
Eureka概述 一个简单的服务注册,服务发现架构 在CAP理论中,eureka选择了ap,作为注册中心,数据可用比数据不一致更重要 逻辑架构图 Eureka特性 1.当注册中心挂了,客户端之间依然可 ...
- Python学习札记(二十) 函数式编程1 介绍 高阶函数介绍
参考: 函数式编程 高阶函数 Note A.函数式编程(Functional Programming)介绍 1.函数是Python内建支持的一种封装,我们通过一层一层的函数调用把复杂任务分解成简单的任 ...
- window 中安装 redis的遇到的一此bug
一.下载 链接:https://github.com/MicrosoftArchive/redis/releases 说明: 如果是是下载msi版本的话会默认帮我们配置好测试 环境,如果是下载zi ...
- Hibernate与 MyBatis的比较(转,留作以后细细钻研)
最近做了一个Hibernate与MyBatis的对比总结,希望大家指出不对之处. 第一章 Hibernate与MyBatis Hibernate 是当前最流行的O/R mapping框架,它出 ...