23种设计模式之解释器模式(Interpreter Pattern)

news2024/10/7 9:16:20

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将23种设计模式中的解释器模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
小威在此先感谢各位大佬啦~~🤞🤞
在这里插入图片描述

🏠个人主页:小威要向诸佬学习呀
🧑个人简介:大家好,我是小威,一个想要与大家共同进步的男人😉😉
目前状况🎉:24届毕业生,在一家满意的公司实习👏👏

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘

以下正文开始
在这里插入图片描述

文章目录

  • 解释器模式概念
  • 如何使用解释器模式
  • 解释器模式优缺点
  • 解释器模式案例
  • 解释器模式小结

解释器模式概念

解释器模式(Interpreter Pattern)是一种对象行为型模式,它定义了一种语言文法并且建立一个解释器来解释该语言中的句子。在解释器模式中,文法和解释器都是通过类来表示的,解释器模式主要用于对复杂的语言解析或者一些专业化的领域语言的处理

解释器模式的核心是解释器类,在解释器模式中一般会定义两种解释器:

终结符解释器(Terminal Expression Interpreter):终结符解释器用于解释语言中的基本单位,对应语法树中的叶子节点,比如变量、常量等。

非终结符解释器(Nonterminal Expression Interpreter):非终结符解释器用于解释一个语法规则,对应语法树中的非叶子节点,比如算术表达式、逻辑表达式等。

如何使用解释器模式

在解释器模式中,我们先将要解释的句子抽象成一个语法树,然后使用递归算法在语法树上进行解释。整个解释过程就相当于不断地对语法树进行遍历,并将每个节点按照特定的规则进行解释。

解释器模式优缺点

解释器模式的优点是可以扩展语法规则,只需要增加相应的解释器即可,而不需要修改已有的解释器。但是,解释器模式的缺点也很明显,由于每个语法规则都需要对应一个解释器,因此解释器模式在解析复杂语句时会造成类膨胀和系统性能下降

解释器模式案例

假设我们现在需要设计一个简单的四则运算语言,实现加减乘除的操作。

实现步骤如下:

首先,我们需要定义一个抽象的表达式接口 Expression,其中定义了 interpret() 方法,用于解释表达式。具体的四则运算符则分别对应非终结符解释器 AddExpression、SubtractExpression、MultiplyExpression 和 DivideExpression。而数字则是终结符解释器 NumberExpression。在每个解释器类中,都需要实现 interpret() 方法来解释相应的表达式。

代码如下:

// 表达式接口
public interface Expression {
    int interpret();
}

// 加法解释器
public class AddExpression implements Expression {
    private Expression left;
    private Expression right;
    
    public AddExpression(Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }
    
    @Override
    public int interpret() {
        return left.interpret() + right.interpret();
    }
}

// 减法解释器
public class SubtractExpression implements Expression {
    private Expression left;
    private Expression right;
    
    public SubtractExpression(Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }
    
    @Override
    public int interpret() {
        return left.interpret() - right.interpret();
    }
}

// 乘法解释器
public class MultiplyExpression implements Expression {
    private Expression left;
    private Expression right;
    
    public MultiplyExpression(Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }
    
    @Override
    public int interpret() {
        return left.interpret() * right.interpret();
    }
}

// 除法解释器
public class DivideExpression implements Expression {
    private Expression left;
    private Expression right;
    
    public DivideExpression(Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }
    
    @Override
    public int interpret() {
        try {
            return left.interpret() / right.interpret();
        } catch (ArithmeticException e) {
            System.out.println("除数不能为0");
            return -1;
        }
    }
}

// 数字解释器
public class NumberExpression implements Expression {
    private int number;
    
    public NumberExpression(int number) {
        this.number = number;
    }
    
    @Override
    public int interpret() {
        return number;
    }
}

现在我们可以使用这些类来解析四则运算表达式了。例如,对于表达式 “1 + 2 * 3 - 4 / 2”,其语法树如下所示:

/ \
  • /
    / \ |
    1 * 2
    /
    3 /
    |
    4

我们可以使用以下代码来解析该表达式:

Expression expression = new SubtractExpression(
                                new AddExpression(
                                    new NumberExpression(1),
                                    new MultiplyExpression(
                                        new NumberExpression(2),
                                        new NumberExpression(3)
                                    )
                                ),
                                new DivideExpression(
                                    new NumberExpression(4),
                                    new NumberExpression(2)
                                )
                            );
int result = expression.interpret();
System.out.println("计算结果为:" + result);

输出结果为:

计算结果为:6

以上示例只是一个简单的示例,实际应用中会更加复杂。但是核心思想是一致的,就是将语言进行解析并最终得到结果。

解释器模式小结

解释器模式在实际开发中的应用场景并不是特别广泛,主要用于一些特定领域的语言解析,比如正则表达式、数学公式解析等

好了,本篇文章就先分享到这里了,后续将会继续介绍23种设计模式之其他模式,感谢大佬认真读完支持咯~
在这里插入图片描述

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论😁
希望能和诸佬们一起努力,今后我们顶峰相见🍻
再次感谢各位小伙伴儿们的支持🤞

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/573145.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言打印九九乘法表的多种方式多种形式(完整,左上,左下,右上,右下)

📢博客主页:肩匣与橘📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢本文由肩匣与橘编写,首发于CSDN🙉📢生活依旧是美好而又温柔的,你也是✨ …

机器学习_Lasso回归_ElasticNet回归_PolynomialFeatures算法介绍_02---人工智能工作笔记0037

Lasso回归用的是L1正则化可以看到,这里的alpha就是这里的alpha对吧,就是 L1的权重 然后对于ElasticNet回归来说,这里的alpha可以看到是L1权重的超参数对吧,然后这里的p,表示的是 L2正则里面的(1-p)这里 这里要提一下: L1和L2为什么能防止过拟合,它们有什么区别?通过添加…

使用CNN-LSTM来预测锂离子电池健康状态SOH(附代码)

对于电动汽车而言,动力锂电池的健康状态(State of Health,SOH)估算方法是电池管理系统中非常重要的一个方面。准确估计锂电池老化状态并预测电池剩余寿命对于电动汽车稳定安全运行有着重要的意义。借助数据驱动方法的思想,本文对锂离子电池寿命历史数据进…

【案例实战】SpringBoot整合EasyExcel实现列表导出功能

这篇文章会给大家实操一个关于列表导出成excel表格的功能,相信大家在日常工作中也会遇到列表导出的需求,看完本篇文章那么你就可以轻松的去整合列表导出的功能。 本次使用的导出工具是阿里巴巴开源的EasyExcel,关于EasyExcel我这里简单的介绍…

Nacos使用详解

一、部署nacos 1、方式一(一般的windows和linux部署) 需要的nacos-server-1.4.1文件:https://download.csdn.net/download/yueyue763184/87822434?spm1001.2014.3001.5503 一般的nacos部署方式教程:https://blog.csdn.net/yue…

敲代码都两年半了,还不会用SDL、C语言rap一个推箱子?

前言 欢迎来到小K的SDL专栏第三小节,本节将为大家带来小项目~C语言SDL版坤坤推箱子详细讲解,这里也为大家上传了源码和图片资源,需要的自取看完以后,希望对你有所帮助 ✨效果如下 文章目录 前言一、推箱子思路讲解二、加SDL绘图代…

离散系统函数零积点分析

离散系统函数零积点分析 在 Matlab中,系统函数的零极点就可以通过函数 roots 得到。 函数的零极点也可以通过函数 tf2zp 获得,其调用格式为:[Z, P, K] tf2zp(B, A),函数 tf2zp 可以将H(z)的有理分式转换为零极点增益形式&#…

WEB端唤起 百度|腾讯|高德 地图一键导航功能

WEB端唤起 百度|腾讯|高德 地图一键导航功能 目录 腾讯地图: 百度地图: 高德地图: 坐标拾取器: 腾讯地图: 极简写法: https://3gimg.qq.com/lightmap/v1/marker/index.html?markercoord:纬度,经度;t…

工业设备状态监测:振动常见原因分析

在工业生产中,设备的正常运行和可靠性对于保障生产效率和安全至关重要。然而,工业设备在运行过程中常常会出现振动现象,这可能是由于多种原因导致的。 根据设备劣化趋势P-F曲线我们可以知道,振动信号监测是状态监测过程中可以被快…

Markdown编辑器 测试

测试一下TOC 你好Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支…

MongoDB的应用

目录 一、MongoDb是什么 1.特点 2.功能 3.基本的指令 二、MongoDB的使用场景 1.适用场合 2.常见应用场景 三、可能遇到的问题 1.MongoDB是否支持事务? 2.MongoDB大数据迁移怎么做? 3.MongoDB的水平扩展是什么原理? 4.MongoDB出现负…

Jenkins UI与接口自动化测试持续集成实战

篇幅较长,要耐心阅读哦~ 基础知识简要回顾 持续集成、持续交付的好处与产生的必然性Jenkins服务的搭建方法Jenkins节点管理与用户权限Jenkins插件Jenkins父子多任务关联运行Jenkins报警机制 目录 SeleniumUI自动化测试持续集成演练接口自动化测试持续集成演练 …

采埃孚-4D毫米波雷达拆解分析

采埃孚4D毫米波雷达拆解分析 4D毫米波雷达具有4个维度的信息,分别是距离、速度、方向角和高度。下面分析采埃孚再飞凡汽车上的4D毫米波雷达。 4D毫米波雷达共由四部分组成,分别为:数字接口板及结构件、屏蔽罩、发射单元及PCB以及雷达天线罩…

如何在 Linux、Windows 和 Mac 上查找 WiFi 密码?

无线网络已成为我们日常生活中不可或缺的一部分,我们经常需要连接各种WiFi网络。但是,有时我们可能会忘记自己的WiFi密码,或者需要连接到一个以前连接过的网络。在这种情况下,我们可以使用一些方法来查找已连接网络的密码。 本文将…

研报精选230526

目录 【行业230526山西证券】有色金属行业周报:锂价强势反弹回30万元or吨 【行业230526开源证券】食品饮料行业投资策略:消费复苏贯穿全年,结构分化择机布局 【行业230526德邦证券】核电行业深度系列报告:积极安全有序发展核电&am…

8-JDBC 编程

目录 1.数据库编程的必备条件 PS:程序是怎么操作数据库的? 2.什么是JDBC? 2.1.JDBC定义 2.2.JDBC工作原理 3.JDBC使用 3.1.创建项目并添加MySQL驱动包 3.2.使用代码操作数据库 3.2.1.获得数据源 3.2.2.获得连接 3.2.3.获得执行器 …

软考A计划-2022年11月软件设计师下午真题及答案解析

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

【云原生|Kubernetes】06-Pod的生命周期和重启策略

【云原生|Kubernetes】06-Pod的生命周期和重启策略 文章目录 【云原生|Kubernetes】06-Pod的生命周期和重启策略Pod生命周期生命周期Pod的状态Pod子状态 Pod重启策略调试PodPod 停滞在 Pending 状态Pod 停滞在 Waiting 状态Pod 处于 Crashing 或别的不健康状态Pod 处于 Running…

【LeetCode热题100】打卡第4天:寻找两个正序数组的中位数

文章目录 寻找两个正序数组的中位数⛅前言🔒题目🔑题解 寻找两个正序数组的中位数 ⛅前言 大家好,我是知识汲取者,欢迎来到我的LeetCode热题100刷题专栏! 精选 100 道力扣(LeetCode)上最热门的…

89.qt qml-WorkerScript多线程使用(无需C++代码)

由于我们自定义Table中需要实现排序,如下图所示: 考虑到如果数据量太大的情况,为了避免主线程阻塞,所以我们添加多线程排序功能,为了方便大家更好学习qml组件,所以学习WorkerScript实现多线程,无需C++ 1.描述 使用 WorkerScript 在新线程中运行操作。这对于在后台运行操…