解释器模式(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:一个强大的解析器生成器,广泛用于实现解释器模式。

总结

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

历史热点文章

相关推荐
Σίσυφος190027 分钟前
halcon 条形码、二维码识别、opencv识别
前端·数据库
学代码的小前端28 分钟前
0基础学前端-----CSS DAY13
前端·css
bing_1581 小时前
简单工厂模式 (Simple Factory Pattern) 在Spring Boot 中的应用
spring boot·后端·简单工厂模式
css趣多多2 小时前
案例自定义tabBar
前端
天上掉下来个程小白2 小时前
案例-14.文件上传-简介
数据库·spring boot·后端·mybatis·状态模式
Asthenia04123 小时前
基于Jackson注解的JSON工具封装与Redis集成实战
后端
编程星空3 小时前
css主题色修改后会多出一个css吗?css怎么定义变量?
开发语言·后端·rust
姑苏洛言3 小时前
DeepSeek写微信转盘小程序需求文档,这不比产品经理强?
前端
林的快手3 小时前
CSS列表属性
前端·javascript·css·ajax·firefox·html5·safari
程序员侠客行3 小时前
Spring事务原理 二
java·后端·spring