再见了IF-ELSE,拥抱规则引擎
程序员文章站
2022-01-07 09:50:48
再见了IF-ELSE,拥抱规则引擎引言设计模式的缺点设计模式无法照顾的场景ibm开源drools示例阿里开源QLExpress-- 最终效果如下 配置规则条件和规则执行结果适用场景其他优点 - 快速交付、面向运营人员引言简单的业务if-else硬编码最简单实用,业务复杂后维护成本就会变高,也违反了开闭原则,if(AgentProcess==A){// 代加工}else if(AgentProcess == B){ // 非代加工}else{}–>方式一:设计模式大法替代...
再见了IF-ELSE,拥抱规则引擎
引言
简单的业务if-else硬编码最简单实用,业务复杂后维护成本就会变高,也违反了开闭原则,
if(AgentProcess==A){
// 代加工
}else if(AgentProcess == B){
// 非代加工
}else{
}
–>方式一:设计模式大法替代if-else,如策略、工厂、模板等 – 适合流程性的 粒度大的,比如保存、批准;
–>方式二:规则引擎 – 非流程性的,细粒度的 具体的复杂多变的业务规则
设计模式的缺点
// 以策略模式为例
dispatch(AgentProcess){
switch(AgentProcess):{
// 路由到具体的处理类
case 'A':return "agentProcessHandle";
case 'B':return "otherHandle";
default :return "defaultHandle";
}
}
设计模式解决if-else,基本上最终变成如下的思路:
1、新建一个子类去处理if-else中的逻辑,
2、实际执行时动态匹配具体的类;
基于以上思路就会有如下问题:
1、流程不能经常变,否则模板或者dispatch的维度就很难抽象 ,
2、分支不能太多,否则类文件就会太多,难以维护-- 所以维度多、粒度太小的就不太适合了
其中阿里的cola架构,能支持到三个维度,“业务身份”,“用例”,“场景” ,如tmall.placeOrder.88vip
设计模式无法照顾的场景
2、hard code的代价非常大,随着业务的膨胀会使开发人员和规则需求方非常的疲惫。— 设计模式会变成过度设计
ibm开源drools示例
// 执行规格引擎
public BigDecimal calculateFare(TaxiRide taxiRide, TaxiFare rideFare) {
KieSession kieSession = kieContainer.newKieSession();
kieSession.setGlobal("rideFare", rideFare);
kieSession.insert(taxiRide);
kieSession.fireAllRules();
kieSession.dispose();
return rideFare.total();
}
规则文件 MY_RULE.drl
global com.softdev.system.demo.entity.TaxiFare rideFare;
import com.softdev.system.demo.entity.TaxiRide;
import java.math.BigDecimal;
dialect "mvel"
/**
* 的士打表计价Drools
* @Author by zhengkai.blog.csdn.net
*/
rule "Calculate Taxi Fare - Output "
salience 100
when
$taxiRide:TaxiRide();
then
System.out.println("#公里数 : "+$taxiRide.getDistanceInMile);
System.out.println("#起步价 : "+12);
rideFare.setNightSurcharge(BigDecimal.ZERO);
rideFare.setRideFare(BigDecimal.ZERO);
end
rule "Calculate Taxi Fare - Less than three kilometers"
salience 99
when
//起步价:首3公里12元; 不论白天黑夜 || distanceInMile = 3
$taxiRide:TaxiRide(distanceInMile <= 3);
then
rideFare.setRideFare(new BigDecimal(12));
end
阿里开源QLExpress-- 最终效果如下 配置规则条件和规则执行结果
适用场景
非流程性的,细粒度的 具体的复杂多变的业务规则
手机运营商资费套餐
超市、商场,商城等等积分计算规则
寿险车险理赔
工资计算(ScriptEngine)
其他优点 - 快速交付、面向运营人员
a、逼迫系统开发人员和业务专家梳理业务,定义统一的BOM(业务对象模型)。
b、业务专家可以快速的制定修改规则,然后交由规则引擎自动化地来处理分析。
c、规则引擎代替系统开发人员,解决由规则条件关联动作变化带来的开发工作。
参考链接
规则引擎概述
本文地址:https://blog.csdn.net/Wen_ching_zhou/article/details/111994150
下一篇: 设计模式学习第十五节 访问者模式