基于 Drools 规则引擎的解决方案

news/2024/7/10 21:02:56 标签: java, 开源

引言

Drools 是一个基于 Java 的开源规则引擎,它允许开发者以规则的形式对业务逻辑进行建模和执行。本文将介绍 Drools 规则引擎的可用场景,并演示如何编写和预览规则。

规则引擎可用场景

规则引擎适用于各种业务场景,包括但不限于:

  • 业务规则自动化:自动执行业务规则,减少人工干预。
  • 实时风险评估:根据实时数据和事实进行风险评估和决策。
  • 订单处理:基于订单属性和条件执行各种处理逻辑。
  • 智能仓库选择:根据特定规则从仓库列表中做选择。

情景案例

假设需求

订单满减

100元以下,减1元 
100元-200元,减3元 
大于200,5元

稍微编程思想比较好的同学一般是这么写:

java">if (order.getTotalPrice() < 100){
   
    order.setDiscount(1);
} else if (order.getTotalPrice() >= 100 && order.getTotalPrice() < 200){
   
    order.setDiscount(3);
} else {
   
    order.setDiscount(5);
}

有人可能会说,随着逻辑变更,这个 if...else 语句可能会变得很长不够优雅,所以,有些懂得设计模式的同学也许会这么做:

java">// 定义策略接口
interface OrderDiscountStrategy {
   

    boolean match(Order order);

    int calDiscount(Order order);
}

// 策略a
class PlanAOrderDiscountStrategy implements OrderDiscountStrategy {
   

    @Override
    boolean match(Order order) {
   
        return order.getTotalPrice() < 100;
    }

    @Override
    int calDiscount(Order order) {
   
        return 1;
    }
}

// 策略b
class PlanBOrderDiscountStrategy implements OrderDiscountStrategy {
   

    @Override
    boolean match(Order order) {
   
        return order.getTotalPrice() >= 100 && order.getTotalPrice() < 200;
    }

    @Override
    int calDiscount(Order order) {
   
        return 3;
    }
}

// 策略c
class PlanCOrderDiscountStrategy implements OrderDiscountStrategy {
   

    @Override
    boolean match(Order order) {
   
        return order.getTotalPrice() > 200;
    }

    @Override
    int calDiscount(Order order) {
   
        return 5;
    }
}

// 策略控制器
public class OrderDiscountStrategyContext {
   

    private List<OrderDiscountStrategy> orderDiscountStrategies = new ArrayList<>();

    public OrderDiscountStrategyContext() {
   
        orderDiscountStrategies.add(new PlanAOrderDiscountStrategy());
        orderDiscountStrategies.add(new PlanBOrderDiscountStrategy());
        orderDiscountStrategies.add(new PlanCOrderDiscountStrategy()<

http://www.niftyadmin.cn/n/5447593.html

相关文章

Mybatis查询列表中的坑

前言 从一个Mybatis列表查询的Bug入手&#xff0c;看一个或许被很多人忽略的Mybatis使用中的大坑。 中间是排查思路。如果不想看排查过程&#xff0c;可以跳过【排查】这一节。 Bug描述 JavaWeb项目中&#xff0c;使用Mybatis查询pg数据库。 在查询一个列表数据的时候&#…

Install Docker

Docker Desktop 直接安装 Docker Desktop Docker Desktop includes the Docker daemon (dockerd), the Docker client (docker), Docker Compose, Docker Content Trust, Kubernetes, and Credential Helper. Linux下安装Docker CE 参考官方文档 参见阿里云的文档 # step 1…

Linux系统下C++程序运行时的内存布局详解。【C++】

Linux系统下C程序的虚拟内存模型。 1.程序代码段存储内容生命周期初始化时机特点代码演示 2.只读初始化数据段存储内容生命周期初始化时机特点代码演示 3.读写初始化数据段存储内容生命周期初始化时机特点代码演示 4. 堆区&#xff08;Heap&#xff09;存储内容生命周期初始化时…

Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用

探索Java高级编程&#xff1a;综合性面试题解析 Java作为一门功能强大的编程语言&#xff0c;在企业级应用开发中占据着举足轻重的地位。本文将深入探讨Java设计模式、内存管理、多线程工具类、并发工具包和并发框架等高级知识点&#xff0c;通过三道综合性的面试题&#xff0…

FlyControls 是 THREE.js 中用于实现飞行控制的类,它用于控制摄像机在三维空间中的飞行。

demo演示地址 FlyControls 是 THREE.js 中用于实现飞行控制的类&#xff0c;它用于控制摄像机在三维空间中的飞行。 入参&#xff1a; object&#xff1a;摄像机对象&#xff0c;即要控制的摄像机。domElement&#xff1a;用于接收用户输入事件的 HTML 元素&#xff0c;通常…

01-JavaScript基础语法

1. 计算机基础 1.1 计算机组成 1.2 数据存储(重点) 计算机内部使用二进制 0 和 1来表示数据。 所有数据&#xff0c;包括文件、图片等最终都是以二进制数据&#xff08;0 和 1&#xff09;的形式存放在硬盘中的。 所有程序&#xff0c;包括操作系统&#xff0c;本质都是各种…

Java面试题:设计一个线程安全的单例模式,并解释其内存占用和垃圾回收机制;使用生产者消费者模式实现一个并发安全的队列;设计一个支持高并发的分布式锁

Java深度面试题&#xff1a;设计模式、内存管理与并发编程的综合考察 随着Java技术的不断发展&#xff0c;对Java开发者的技术要求也在不断提高。设计模式、内存管理、多线程工具类以及并发工具包和框架等都是Java开发者必须掌握的核心知识点。本文将通过三道综合性的面试题&a…

面试算法-78-两两交换链表中的节点

题目 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4] 输出&#xff…