惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
Stack Overflow Blog
Stack Overflow Blog
人人都是产品经理
人人都是产品经理
Y
Y Combinator Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
D
DataBreaches.Net
GbyAI
GbyAI
Microsoft Security Blog
Microsoft Security Blog
博客园_首页
大猫的无限游戏
大猫的无限游戏
Jina AI
Jina AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Engineering at Meta
Engineering at Meta
IT之家
IT之家
MongoDB | Blog
MongoDB | Blog
The GitHub Blog
The GitHub Blog
月光博客
月光博客
U
Unit 42
Hugging Face - Blog
Hugging Face - Blog
博客园 - 叶小钗
腾讯CDC
B
Blog RSS Feed
博客园 - Franky
爱范儿
爱范儿

牛牛技术客栈

设计模式-备忘录模式 - OXOXTECH 牛牛技术客栈 设计模式-中介者模式 - OXOXTECH 牛牛技术客栈 Linux【Ubuntu】修改ssh默认端口 - OXOXTECH 牛牛技术客栈 设计模式-迭代器模式 - OXOXTECH 牛牛技术客栈 scheduled定时任务的三种基本实现方式 - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(三) - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(二) - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(一) - OXOXTECH 牛牛技术客栈 基于JavaFX的桌面端网络调试工具 - OXOXTECH 牛牛技术客栈 Golang Channel的原理介绍 - OXOXTECH 牛牛技术客栈 Go语言Map的原理分析 - OXOXTECH 牛牛技术客栈 Go语言错误处理(panic)的最佳实践 - OXOXTECH 牛牛技术客栈 Redis报错Redis is configured to save RDB snapshots, but it's currently unable to persist to disk. go-webpbin库在Linux报错failed to encode image to WebP: exit status 1.......的问题 exe4j 打包加密的jar - OXOXTECH 牛牛技术客栈 Go生成图形验证码示例 - OXOXTECH 牛牛技术客栈 澳门一天游:一日尽享东方与西方的交融之美 - OXOXTECH 牛牛技术客栈 设计模式-命令模式 - OXOXTECH 牛牛技术客栈 别再自己瞎写工具类了,SpringBoot内置工具类应有尽有 - OXOXTECH 牛牛技术客栈 中山一日游 - OXOXTECH 牛牛技术客栈 设计模式-责任链模式 - OXOXTECH 牛牛技术客栈 起舞吧,齐舞吧 - OXOXTECH 牛牛技术客栈 设计模式-组合模式 - OXOXTECH 牛牛技术客栈 Go语言Web开发|GoFrame框架入门笔记 - OXOXTECH 牛牛技术客栈 Java打包exe教程 - OXOXTECH 牛牛技术客栈 设计模式-代理模式 - OXOXTECH 牛牛技术客栈 MySQL存储过程的优缺点有哪些? - OXOXTECH 牛牛技术客栈 前端渲染优化有哪些? - OXOXTECH 牛牛技术客栈 HTTP状态码及其含义 - OXOXTECH 牛牛技术客栈 从浏览器地址栏输入url到显示页面的步骤 - OXOXTECH 牛牛技术客栈
设计模式-解释器模式 - OXOXTECH 牛牛技术客栈
Jensen · 2025-04-01 · via 牛牛技术客栈

设计模式-解释器模式

Jensen Java Java, 设计模式

前言

Java开发中,设计模式是常用的一种编码方式,合理使用设计模式可以帮助开发人员更快地编写出高效、可靠和可维护的代码。本期将撰写一个关于设计模式的系列文章,总共23种设计模式将以一篇一篇文章讲解,代码笔记已开源至:Gitee点击跳转。在上一篇《Java设计模式(13)命令模式》文章中,我们介绍了命令模式。本文是这个系列的第十四篇章,我们将讲解一下解释器模式的实现方式、应用场景以及它的用途。

解释器模式

解释器模式 是一种行为型设计模式,它定义了一种语言语法,以及解释器,可以解释这种语法。解释器模式通常用于编译器、解析器、表达式计算器等领域。

使用场景

1. 编译器、解释器:如正则表达式解析器、SQL 解析器、数学表达式计算器。

2. 规则引擎:如防火墙规则、权限系统中的访问控制规则。

3. 脚本语言:如计算器应用的表达式解析。

代码实现

下面是一个简单的数学表达式解释器,支持加、减、乘、除法运算。

/**
 * 表达式接口
 * @author Jensen
 * @date 2024-04-22
 * */
public interface Expression {
    double interpreter();
}

/**
 * 被计算的数字
 * @author Jensen
 * @date 2024-04-22
 * */
public class NumberExpression implements Expression {
    private final double number;

    public NumberExpression(double number) {
        this.number = number;
    }
    @Override
    public double interpreter() {
        return number;
    }
}

/**
 * 加法
 * @author Jensen
 * @date 2024-04-22
 * */
public class AddExpression implements Expression {
    private final Expression leftExpression;
    private final Expression rightExpression;

    public AddExpression(Expression leftExpression, Expression rightExpression) {
        this.leftExpression = leftExpression;
        this.rightExpression = rightExpression;
    }
    @Override
    public double interpreter() {
        return leftExpression.interpreter() + rightExpression.interpreter();
    }
}

/**
 * 减法
 * @author Jensen
 * @date 2024-04-22
 * */
public class SubtractExpression implements Expression {
    private final Expression leftExpression;
    private final Expression rightExpression;

    public SubtractExpression(Expression leftExpression, Expression rightExpression) {
        this.leftExpression = leftExpression;
        this.rightExpression = rightExpression;
    }
    @Override
    public double interpreter() {
        return leftExpression.interpreter() - rightExpression.interpreter();
    }
}

/**
 * 乘法
 * @author Jensen
 * @date 2024-04-22
 * */
public class MultExpression implements Expression {
    private final Expression leftExpression;
    private final Expression rightExpression;

    public MultExpression(Expression leftExpression, Expression rightExpression) {
        this.leftExpression = leftExpression;
        this.rightExpression = rightExpression;
    }
    @Override
    public double interpreter() {
        return leftExpression.interpreter() * rightExpression.interpreter();
    }
}

/**
 * 除法
 * @author Jensen
 * @date 2024-04-22
 * */
public class DivisionExpression implements Expression {
    private final Expression leftExpression;
    private final Expression rightExpression;

    public DivisionExpression(Expression leftExpression, Expression rightExpression) {
        this.leftExpression = leftExpression;
        this.rightExpression = rightExpression;
    }
    @Override
    public double interpreter() {
        if (rightExpression.interpreter() == 0){
            System.out.println("除数不能为0");
            return 0;
        }
        return leftExpression.interpreter() / rightExpression.interpreter();
    }
}

这个示例展示了如何用解释器模式解析数学表达式,能够计算 (x + x) - (x + x) 这样的表达式,并且可以轻松扩展更多运算方式。

测试使用

System.out.println("------------------------------解释器模式-----------------------------");
AddExpression expr1 = new AddExpression(new NumberExpression(10), new NumberExpression(25));
AddExpression expr2 = new AddExpression(new NumberExpression(10), new NumberExpression(22));
System.out.println("expr1加法结果:"+expr1.interpreter());
System.out.println("expr2加法结果:"+expr2.interpreter());
System.out.println("expr1与expr2减法结果:"+new SubtractExpression(expr1, expr2).interpreter());
System.out.println("expr1与expr2乘法结果:"+new MultExpression(expr1, expr2).interpreter());
System.out.println("expr1与expr2除法结果:"+new DivisionExpression(expr1, expr2).interpreter());

输出结果

20250401172618139.webp

结语

解释器模式适用于特定领域的语法解析,可以将规则拆分为多个类,使得代码结构清晰,易于扩展。然而,它的缺点是可能会导致大量类的增加,从而影响性能,当规则变得复杂时,维护成本也会提高。因此,使用解释器模式需要注意。