《Drools7.0.0.Final规则引擎教程》第4章 4.6 结果条件
来源:互联网 发布:手机视频剪辑合并软件 编辑:程序博客网 时间:2024/06/06 14:24
结果条件
在Java中,如果有重复的代码我们会考虑进行重构,抽取公共方法或继承父类,以减少相同的代码在多处出现,达到代码的最优管理和不必要的麻烦。Drools同样提供了类似的功能。下面我们以实例来逐步说明。
像下面最原始的两条规则,有相同的业务判断,也有不同的地方:
package com.rules.conditionalimport 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");endrule "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.conditionalimport 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");endrule "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.conditionalimport 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.conditionalimport 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.conditionalimport 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规则引擎教程》第4章 4.1 规则文件
- 《Drools7.0.0.Final规则引擎教程》第4章 4.2 no-loop
- 《Drools7.0.0.Final规则引擎教程》第4章 4.2 lock-on-active
- 《Drools7.0.0.Final规则引擎教程》第4章 4.2 ruleflow-group&salience
- 《Drools7.0.0.Final规则引擎教程》第4章 4.2 agenda-group
- 《Drools7.0.0.Final规则引擎教程》第4章 4.2 auto-focus
- 《Drools7.0.0.Final规则引擎教程》第4章 4.2 activation-group& dialect& date-effective
- 《Drools7.0.0.Final规则引擎教程》第4章 4.3 定时器
- 《Drools7.0.0.Final规则引擎教程》第4章 4.3 日历
- 《Drools7.0.0.Final规则引擎教程》第4章 4.4 LHS简介&Pattern
- 《Drools7.0.0.Final规则引擎教程》第4章 4.4 约束(Pattern的一部分)
- 《Drools7.0.0.Final规则引擎教程》第4章 4.5RHS语法
- 《Drools7.0.0.Final规则引擎教程》第4章 注释&错误信息
- 《Drools7.0.0.Final规则引擎教程》第4章 4.9 关键字
- 《Drools7.0.0.Final规则引擎教程》第4章 global全局变量
- 《Drools7.0.0.Final规则引擎教程》第4章 Query查询之基础
- 《Drools7.0.0.Final规则引擎教程》第4章 Function函数
- 2017 Multi-University Training Contest
- 路由器和交换机的区别,太经典了
- C. Prime Number----数论+快速幂
- Caffe .build_release/lib/libcaffe.so:对‘cv::imread(cv::String const&, int)’未定义的引用
- python数据分析与展示(二)
- 《Drools7.0.0.Final规则引擎教程》第4章 4.6 结果条件
- 杭电acm 3613Best Reward(字符串)
- Linux源代码—中断
- change dhcp to static on your localhost ip configuration
- G
- hibernate和mybatis共存问题
- 【JSOI2016】最佳团队
- 利用Photoshop javascript 给图片添加拍摄日期(creation date)
- VLAN小知识