【设计模式】解释器模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

article/2025/9/15 11:45:07

文章目录

  • 一、解释器模式简介
  • 二、解释器模式适用场景
  • 三、解释器模式优缺点
  • 四、解释器模式与适配器模式
  • 五、解释器模式代码示例
    • 1、解释器接口
    • 2、加法解释器
    • 3、乘法解释器
    • 4、整型解释器
    • 5、语法解析类
    • 6、工具类
    • 7、测试类





一、解释器模式简介



解释器模式 : 给定一个 语言 , 定义它的 文法 的一种表示 , 并定义一个 解释器 , 这个 解释器 使用该表示来 解释 语言中的 句子 ;

文法 可以理解成一种 语法 ;

为了解释一种语言 , 而为语言创建的 解释器 ;

如 : Java 代码 , 需要编译器进行编译之后才能运行 , 这个编译器就相当于解释器 ;


解释器模式类型 : 行为型 ;





二、解释器模式适用场景



解释器模式适用场景 : 某个 特定类型问题 发生频率 足够高 ;

日志处理 : 使用 脚本语言 或 编程语言 处理日志时 , 有很多服务 会产生 大量的日志 , 需要 对日志进行解析 , 生成报表 ;

各个服务的日志格式不同 , 数据中的要素相同 , 这种情况下 , 通过程序解决上述问题 , 主要的解决方案就是使用解释器模式 ;


日常项目中 , 解释器模式使用情况很少 ;

解释器一般是 开源包 , 如 Express4J , JEP ;





三、解释器模式优缺点



解释器模式优点 : 语法 由 很多类 表示 , 容易 改变扩展 " 语言 " ;

" 语言 " 用引号标注 , 这些语言不足以称为一门 编程语言 ;


解释器模式缺点 : 如果 语法规则 数目太多 , 会增加 系统 复杂度 ;

每个规则 都要与之对应 一个类 , 如果规则太多 , 则需要创建很多类 ;


解释器模式在实际业务中 , 是使用频率很低的设计模式 ;





四、解释器模式与适配器模式



解释器模式与适配器模式 : 这两个模式类似 , 但是略有不同 ;

  • 适配器模式 : 不需要 预先知道 适配器的 规则 ;

  • 解释器模式 : 需要 预先将规则写好 , 根据规则执行解释 ;





五、解释器模式代码示例



业务场景 :

输入字符串

10 2 3 + *

将字符串使用空格切割成数组
遇到数字直接入栈
遇到运算符 , 从栈中取出两个数据 , 进行计算 , 将计算结果再放入栈中
遍历完毕后 , 最终的栈内数据就是最终结果


1、解释器接口


package interpreter;/*** 解释器接口*/
public interface Interpreter {/*** 解释方法* @return*/int interpret();
}

2、加法解释器


package interpreter;/*** 加法解释器*      实现 Interpreter 解释器 接口* 用于实现加法计算*      加法有加数 和 被加数 , 两个加数分别也都是一个解释器*/
public class AddInterpreter implements Interpreter {/*** 第一个表达式*/private Interpreter firstInterpreter;/*** 第二个表达式*/private Interpreter secondInterpreter;public AddInterpreter(Interpreter firstInterpreter,Interpreter secondInterpreter) {this.firstInterpreter = firstInterpreter;this.secondInterpreter = secondInterpreter;}@Overridepublic int interpret() {return this.firstInterpreter.interpret() +this.secondInterpreter.interpret();}@Overridepublic String toString() {return "+";}
}

3、乘法解释器


package interpreter;/*** 乘法解释器*      实现 Interpreter 解释器 接口* 用于实现乘法计算*      两个乘数分别也都是一个解释器*/
public class MultiInterpreter implements Interpreter {/*** 第一个表达式*/private Interpreter firstInterpreter;/*** 第二个表达式*/private Interpreter secondInterpreter;public MultiInterpreter(Interpreter firstInterpreter,Interpreter secondInterpreter) {this.firstInterpreter = firstInterpreter;this.secondInterpreter = secondInterpreter;}@Overridepublic int interpret() {return this.firstInterpreter.interpret() *this.secondInterpreter.interpret();}@Overridepublic String toString() {return "*";}
}

4、整型解释器


package interpreter;/*** 数字解释器*      实现 Interpreter 解释器 接口*/
public class NumberInterpreter implements Interpreter {/*** 核心数字*      需要将传入的数据转为数字*/private int number;/*** 直接设置数字类型* @param number*/public NumberInterpreter(int number) {this.number = number;}/*** 将字符串转为数字类型* @param number*/public NumberInterpreter(String number) {this.number = Integer.parseInt(number);}@Overridepublic int interpret() {return this.number;}@Overridepublic String toString() {return "" + this.number;}
}

5、语法解析类


package interpreter;import java.util.Stack;/*** 语法解析*/
public class ExpressionParser {/*** 存放解释器的栈*      栈的特点是先进后出*/private Stack<Interpreter> stack = new Stack<>();/*** 解析字符串语法* @param str*/public void parse(String str) {// 通过空格分割字符串String[] strArray = str.split(" ");// 遍历栈中的字符串for (String symbol : strArray) {if (!OperatorUtils.isOperator(symbol)) {// 如果不是操作符 , 说明是数字 , 则直接入栈Interpreter interpreter = new NumberInterpreter(symbol);stack.push(interpreter);System.out.println(symbol + " 入栈");} else {// 如果是操作符 , 则数据出栈 , 处理是操作符运算的情况// 取出两个需要计算的元素Interpreter firstInterpreter = stack.pop();System.out.println(firstInterpreter + " 出栈");Interpreter secondInterpreter = stack.pop();System.out.println(secondInterpreter + " 出栈");// 获取 运算符号 对应的解释器Interpreter operator = OperatorUtils.getExpressionInterpretor(symbol,firstInterpreter,secondInterpreter);System.out.println("运算符 " + operator + " 出栈");// 计算 运算符 运算结果int result = operator.interpret();// 将计算结果你年入栈NumberInterpreter numberInterpreter = new NumberInterpreter(result);stack.push(numberInterpreter);System.out.println("计算结果 " + result + " 入栈");}}// 取出最终计算结果 , 计算完毕后 , 整个栈必然只剩下一个元素int result = stack.pop().interpret();System.out.println("最终计算结果 : " + result);}
}

6、工具类


package interpreter;public class OperatorUtils {/*** 判断传入的符号字符串是否是操作符* @param symbol* @return*/public static boolean isOperator(String symbol) {return symbol.equals("+") || symbol.equals("*");}public static Interpreter getExpressionInterpretor(String symbol,Interpreter firstInterpreter,Interpreter secondInterpreter) {Interpreter interpreter = null;if (symbol.equals("+")) {interpreter = new AddInterpreter(firstInterpreter, secondInterpreter);} else if (symbol.equals("*")) {interpreter = new MultiInterpreter(firstInterpreter, secondInterpreter);}return interpreter;}
}

7、测试类


package interpreter;public class Main {public static void main(String[] args) {// 将字符串使用空格切割成数组// 遇到数字直接入栈// 遇到运算符 , 从栈中取出两个数据 , 进行计算 , 将计算结果再放入栈中// 遍历完毕后 , 最终的栈内数据就是最终结果String text = "10 2 3 + *";ExpressionParser parser = new ExpressionParser();parser.parse(text);}
}

执行结果 :

10 入栈
2 入栈
3 入栈
3 出栈
2 出栈
运算符 + 出栈
计算结果 5 入栈
5 出栈
10 出栈
运算符 * 出栈
计算结果 50 入栈
最终计算结果 : 50

在这里插入图片描述


http://chatgpt.dhexx.cn/article/K44Vjuoa.shtml

相关文章

linux每周2 4 6执行定时任务,linux计划任务crontab例子

/root/send_msg.sh #要自动执行的脚本程序路径 chmod +x /root/send_msg.sh #对脚本文件添加执行权限,否则不能执行 vim /etc/crontab #编辑配置文件,在最后一行添加内容 30 1 * * * root /root/send_msg.sh #表示每天凌晨1点30执行备份 :wq! #保存退出 service crond restar…

Crontab 在线生成器 - Linux计划任务

Linux系统里有一个很方便的程序「例行性计划任务」&#xff08;Crontab&#xff09;&#xff0c;接触过的朋友一定不陌生。Crontab 主要是让系统去执行一些固定时间要自动进行的例行性工作&#xff0c;最常用的例如备份资料、移除暂存文件、更新或重新启动等等。如果将某个周期…

Linux计划任务以及进程检测与控制

安装第三方环境变量 /etc/profile PATH export PATH $home /.bashrc 当前用户的bash信息&#xff08;aliase&#xff0c;umask&#xff09; $home/.bash_profile 当前用户的环境变量的信息 $home /.bash_logout /ect/bashrc 使用bash shell用户全局变量 /etc/profile 系统和…

Linux服务器查看任务计划,Linux的任务计划

Linux的任务计划 我们在使用系统的过程中&#xff0c;经常需要在以后的某个时间点执行一个任务&#xff0c;而我们又不在机器旁边的时候&#xff0c;比如在半夜时服务器访问的用户很少&#xff0c;宽带资源很充足的时候&#xff0c;要去镜像软件包、重启服务器(虽然Linux很稳定…

Linux 计划任务讲解

目录 计划任务 一次性计划任务 长期性计划任务 计划任务 管理员可以编辑自己的和普通用户的计划任务 普通用户只可以编辑自己的计划任务 计划任务根据执行方式分为一次性计划任务、长期性计划任务 一次性计划任务 此计划只执行一次&#xff0c;执行后或就不会再执行了 通…

Linux计划任务-定时任务

Linux计划任务-定时任务 at单次计划任务at命令格式查看at任务取消at计划任务创建1分钟后的单次任务 定时任务分类cron系统任务调度/etc/crontab文件格式 用户任务调度安装crontab conrtab常用添加计划任务指定用户创建计划任务 查看用户的计划任务计划任务日志存储目录查看所有…

Linux 计划任务

计划任务主要是做一些周期性的任务&#xff0c;目前最主要的用途是定期备份数据。 #分类 ##一次性调度执行 at Schedule one-time tasks with at. 语法格式&#xff1a;at 时间点 例如&#xff1a; [rootBJcoud_computing_hp_hao ~]# at now 2min 2分钟之后 [rootBJcoud_co…

Linux基础之计划任务

在Linux的运维中&#xff0c;我们经常会使用到计划任务&#xff0c;所谓计划任务就是在某个时间让计算机做某件事情。我们可以将计划任务分为一次性的调度执行和循环调度执行。 一、一次性调度执行 一次性调度执行在实际情况中使用少于循环调度执行。在Linux操作系统中使用at &…

linux(计划任务)

一、概念 计划任务就是按照计划定时的去执行任务 二、crond程序--是linux里负责执行计划任务的程序 &#xff08;1&#xff09;使用crontab命令调用crond进程 &#xff08;2&#xff09;crond程序--每隔一分钟去检查是否有计划任务要执行. 2、crond进程的启动、重启、停止 …

Excel2019打开文件时会同时打开一个名为Sheet1的未保存空白工作簿

因为安装了MySQL导致 解决办法&#xff1a; 1、右键EXCEL以管理员身份打开 2、点击“文件”——“选项”——“加载项” 在下方“管理”的下拉框中选择“COM加载项” 点击“转到”&#xff0c;在弹出的界面中取消MySQL For Excel的勾选——确定 再次打开Excel便不会出现打开…

EXCEL每次打开文件都会出现一个空白sheet1窗口

不需要禁用所有加载项&#xff0c;禁用所有的加载项会影响功能&#xff0c;找到COM加载项&#xff0c;转到&#xff0c;取消勾选MySQL的加载项&#xff0c;取消后没有自动创建的sheet1工作簿了&#xff0c;希望有帮助

“EXCEL 文件打开后,显示空白”的解决方法

今天遇到一个很奇怪的问题&#xff0c;一个Excel文件&#xff0c;大小大概50K左右&#xff0c;里面肯定是有内容的。 但打开后&#xff0c;显示的却是空白&#xff0c;如下图&#xff1a; 临时解决方案&#xff1a; 选择打开方式“使用IE打开”&#xff0c;之后弹出的对话框&am…

excel表格打开灰色,没有内容

1、修改注册列表&#xff0c;快捷键 winR,然后输入regedit,回车进入&#xff1b; 2、找 HKEY_CLASSES_ROOT ; Excel.Sheet.12 ; shell ; open ; command ; 3、双击右侧“默认”图标编辑&#xff0c;将数值最后的/dde修改成"%1"&#x1f62d;"%1"与前面的…

已解决:EXCEL每次打开文件都会再出现一个空白sheet1文件

问题描述 安装过MySQL后&#xff0c;它自动关联到excel &#xff0c;以引用其数据源。但是这样一来&#xff0c;每次打开&#xff0c;都会加载一个新的文件sheet1&#xff0c;每次都得手动关闭&#xff1b;在网上搜了一大堆&#xff08;什么禁用相关COM加载项&#xff0c;等等…

Excel2016打开文件空白

安装Office 2016&#xff0c;打开excel文件&#xff0c;显示空白 解决方案 winr,输入regedit定位到HKEY_CLASSES_ROOT\Excel.Sheet.12\shell\Open\command将原值修后加上"%1"(包括英文半角双引号,前面有一空格)&#xff0c;修改以后为 "C:\Program Files\Micros…

Excel打开之后没有内容显示一片空白

打开一个有内容的excel表格&#xff0c;发现没有任何显示&#xff0c;一片空白 解决办法&#xff1a; 开始 — 运行 — regedit 修改HKEY_CLASSES_ROOT\Excel.Sheet.12\shell\Open\command项默认值 原值&#xff1a; "C:\Program Files\Microsoft Office\Root\Offic…

直接打开xls、xlsx文件,Excel显示灰色空白

。。。 最近我需要使用visio&#xff0c;但是我的office365里没有&#xff0c;于是我下载了一个visio 2016&#xff0c;安装的时候连着office2016一同安装了&#xff0c;不知道能不能共存&#xff0c;之后直接打开xls、xlsx等文件会出现灰色空白&#xff0c;必须进入excel程序…

【软件】Excel打开空白,需要在里面再次选择文件位置打开

前面介绍了Excel打开报错 0xc0000022的解决办法&#xff0c;方法请点击连接&#xff1a; https://blog.csdn.net/qq_26741933/article/details/111225800 但是发现打开表格全部是灰色&#xff0c;需要点击"文件"--“打开” 选择文件位置才能打开&#xff1a; 需要修…

Excel:打开后有空白的Sheet1

我是在装了MySQL 5.8以后&#xff0c;就出现了这个问题。 无论开什么Excel文件&#xff0c;甚至直接打开excel这个程序&#xff0c;都会出现一个空白的Sheet1。 查到了资料&#xff0c;禁用MySQL的加载项即可。 Excel - 文件 - 选项 - 加载项 - MySQL For Excel - 管理选到“…

office2016中EXCEL文件第一次打开是空白文档,第二次才能打开处理方式

1、开始–>运行–>regedit2、修改HKEY_CLASSES_ROOT\Excel.Sheet.12\shell\Open\command项默认值。原值&#xff1a;C:\Program Files\Microsoft Office\Root\Office16\EXCEL.EXE增加"%1"&#xff0c;如下&#xff1a; C:\Program Files\Microsoft Office\Root…