当前位置: 萬仟网 > IT编程>软件设计>设计模式 > 再见了IF-ELSE,拥抱规则引擎

再见了IF-ELSE,拥抱规则引擎

2020年12月31日  | 萬仟网IT编程  | 我要评论
再见了IF-ELSE,拥抱规则引擎引言设计模式的缺点设计模式无法照顾的场景ibm开源drools示例阿里开源QLExpress-- 最终效果如下 配置规则条件和规则执行结果适用场景其他优点 - 快速交付、面向运营人员引言简单的业务if-else硬编码最简单实用,业务复杂后维护成本就会变高,也违反了开闭原则,if(AgentProcess==A){// 代加工}else if(AgentProcess == B){ // 非代加工}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、规则引擎代替系统开发人员,解决由规则条件关联动作变化带来的开发工作。

参考链接
规则引擎概述

规则引擎技术选型-阿里qlExpress

美团自有规则引擎Zeus(中文名“宙斯”)

QLExpress 规则引擎使用介绍

本文地址:https://blog.csdn.net/Wen_ching_zhou/article/details/111994150

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

  • 设计模式 |备忘录模式(memento)

    设计模式 |备忘录模式(memento)

    定义: 定义: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。 结构:(书... [阅读全文]
  • HeadFirst设计模式(一)策略者模式

    HeadFirst设计模式(一)策略者模式

    最近在看HeadFirst设计模式一书,作为一个半路出家的程序员,感觉很多东西需要学习,学习的路程中有些东西学了当时觉得理解了,但日常工作中没有使用... [阅读全文]
  • 创建型设计模式对比总结 设计模式(八)

    创建型设计模式是设计模式的入门基础,主要包括工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式,以及简单工厂模式,本文对他们进行了分析对比,... [阅读全文]
  • 设计模式-结构型-外观模式

    外观模式(Facade): 外部通过一个统一的接口,访问子系统中的一群接口。外观模式定义了一个高层接口,为子系统中的一组接口提供一个一致的入口,使得... [阅读全文]
  • SpringBoot | 第六章:常用注解介绍及简单使用

    前言 之前几个章节,大部分都是算介绍springboot的一些外围配置,比如日志配置等。这章节开始,开始总结一些关于springboot的综合开发的... [阅读全文]
  • 抽象工厂模式

    抽象工厂模式

    抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类... [阅读全文]
  • 23种设计模式+J2EE设计模式学习笔记-初识设计模式

    设计模式简介: 设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。(个人理解:设计模式是不关乎业务,逻辑实现,针对普遍问... [阅读全文]
  • UI设计师缺乏灵感,看看这些可以临摹的网站架构!

    UI设计师缺乏灵感,看看这些可以临摹的网站架构!

    首先,它需要一个坚实的基础,然后是能够承载所有内容的框架,做好后要好好装饰一下。同样的思维模式可以套用在网站的设... [阅读全文]
  • 设计模式系列 - 单例模式

    单例模式就是指单例类在一定的生命周期内只能有一个对象实例,单例类的创建必须是本身,并能给使用者提供自身。 介绍 在现实世界中,每个生命体都可以被看做... [阅读全文]
  • 创建型设计模式(上)

    创建型设计模式(上)

    单例模式: 1、定义:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类 2、实现过程要点: (1)单例类的... [阅读全文]
验证码:
Copyright © 2017-2021  萬仟网 保留所有权利. 粤ICP备17035492号-1
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com