解释器模式(Interpreter Pattern):电商平台优惠规则解析实战案例分析

肖哥弹架构 跟大家"弹弹" 业务中设计模式的使用,需要代码关注

欢迎 点赞,点赞,点赞。

关注公号Solomon肖哥弹架构获取更多精彩内容

在电商平台中,优惠规则多种多样,例如满减、打折、买赠等。为了能够灵活地解析和应用这些优惠规则,需要一个能够解释和执行优惠规则的系统。

2. 为什么要使用解释器设计模式

解释器模式允许定义一个语言的文法,并建立一个解释器,该解释器可以解释和执行语言中的句子,非常适合用于解析和执行优惠规则。

3. 标准解释器设计模式图

4. 业务解释器设计模式图

5. 业务代码参考

java 复制代码
    // 优惠规则接口
    interface DiscountRule {
        void parse(String rule);
        double calculateDiscount(double amount);
    }

    // 满减优惠规则
    class FullReductionRule implements DiscountRule {
        private int threshold;
        private double discountAmount;

        @Override
        public void parse(String rule) {
            // 解析规则字符串,例如 "1000-50" 表示满1000减50
            String[] parts = rule.split("-");
            threshold = Integer.parseInt(parts[0]);
            discountAmount = Double.parseDouble(parts[1]);
        }

        @Override
        public double calculateDiscount(double amount) {
            if (amount >= threshold) {
                return discountAmount;
            }
            return 0;
        }
    }

    // 百分比优惠规则
    class PercentageDiscountRule implements DiscountRule {
        private double percentage;

        @Override
        public void parse(String rule) {
            // 解析规则字符串,例如 "0.8" 表示8折
            percentage = Double.parseDouble(rule);
        }

        @Override
        public double calculateDiscount(double amount) {
            return amount * (1 - percentage);
        }
    }

    // 优惠上下文
    class DiscountContext {
        private DiscountRule rule;
        private double discount;

        public void setRule(DiscountRule rule) {
            this.rule = rule;
        }

        public void setDiscount(double discount) {
            this.discount = discount;
        }

        public double getDiscount() {
            return discount;
        }

        public void applyDiscount(double amount) {
            if (rule != null) {
                discount = rule.calculateDiscount(amount);
            }
        }
    }

    // 客户端使用
    class ECommerceDiscountSystem {
        public static void main(String[] args) {
            DiscountContext context = new DiscountContext();
            String rule = "1000-50"; // 满1000减50
            context.setRule(new FullReductionRule());
            context.applyDiscount(1500); // 应用优惠规则
            System.out.println("Discount: " + context.getDiscount());

            // 应用百分比优惠规则
            rule = "0.8"; // 8折
            context.setRule(new PercentageDiscountRule());
            context.applyDiscount(200); // 应用优惠规则
            System.out.println("Discount: " + context.getDiscount());
        }
    }

6. 使用解释器设计模式的好处

  • 规则灵活性:可以灵活地添加和修改优惠规则,而不需要修改现有的优惠系统代码。
  • 易于扩展 :新增优惠规则时,只需实现DiscountRule接口。

7. 其他使用解释器设计模式场景参考

  • 文本解析:如解析配置文件或脚本语言。
  • 语法分析:如编程语言的语法分析器。

8. 可参考开源框架

  • ANTLR:一个强大的解析器生成器,广泛用于实现解释器模式。

总结

解释器模式非常适合用于实现规则引擎,它允许系统灵活地解释和执行定义好的规则,如电商平台的优惠规则。

历史热点文章

相关推荐
章豪Mrrey nical2 小时前
前后端分离工作详解Detailed Explanation of Frontend-Backend Separation Work
后端·前端框架·状态模式
派大鑫wink3 小时前
【JAVA学习日志】SpringBoot 参数配置:从基础到实战,解锁灵活配置新姿势
java·spring boot·后端
程序员爱钓鱼4 小时前
Node.js 编程实战:文件读写操作
前端·后端·node.js
xUxIAOrUIII4 小时前
【Spring Boot】控制器Controller方法
java·spring boot·后端
PineappleCoder4 小时前
工程化必备!SVG 雪碧图的最佳实践:ID 引用 + 缓存友好,无需手动算坐标
前端·性能优化
Dolphin_Home4 小时前
从理论到实战:图结构在仓库关联业务中的落地(小白→中级,附完整代码)
java·spring boot·后端·spring cloud·database·广度优先·图搜索算法
zfj3214 小时前
go为什么设计成源码依赖,而不是二进制依赖
开发语言·后端·golang
weixin_462446234 小时前
使用 Go 实现 SSE 流式推送 + 打字机效果(模拟 Coze Chat)
开发语言·后端·golang
JIngJaneIL4 小时前
基于springboot + vue古城景区管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
敲敲了个代码5 小时前
隐式类型转换:哈基米 == 猫 ? true :false
开发语言·前端·javascript·学习·面试·web