设计模式(22):解释器模式
解释器
- 是一种不常用的设计模式
- 用于描述如何构成一个简单的语言解释器,主要用于使用面向对象语言开发的解释器和解释器设计
- 当我们需要开发一种新的语言时,可以考虑使用解释器模式
- 尽量不要使用解释器模式,后期维护会有很大麻烦。在项目中,可以使用jruby、groovy、java的js引擎来替代解释器的作用,弥补java语言的不足。
开发中常见的场景
- EL表达式的处理
- 正则表达式解释器
- SQL语法的解释器
- 数学表达式解释器
举例代码实现
- 解析和执行数学表达式
输入"5+4*5-8/4",输出“23” - 抽象解释器接口
/*** 抽象解释器接口*/
public interface Expression {int interpret(Context context);
}
- 终结符表达式
/*** 数值表达式---终结符表达式*/
public class NumberExpression implements Expression{private Integer number;public NumberExpression(Integer number) {super();this.number = number;}@Overridepublic int interpret(Context context) {return number;}
}
/*** 运算符号表达式---终结符表达式* symbol:* 1:加 * 2:减 * 3:乘 * 4:除 */
public class SymbolExpression implements Expression {private int symbol; public SymbolExpression(int symbol) {super();this.symbol = symbol;}@Overridepublic int interpret(Context context) {return symbol;}
}
- 非终结符表达式
/*** 加法表达式——加法表达式也是数值表达式的一种*/
public class AdditionExpression extends NumberExpression{private NumberExpression left;private NumberExpression right;public AdditionExpression(NumberExpression left, NumberExpression right) {super(1);this.left = left;this.right = right;}@Overridepublic int interpret(Context context) {return left.interpret(context) + right.interpret(context);}
}
/*** 减法表达式---减法表达式也是数值表达式的一种*/
public class SubtractExpression extends NumberExpression{private NumberExpression left;private NumberExpression right;public SubtractExpression(NumberExpression left, NumberExpression right) {super(2);this.left = left;this.right = right;}@Overridepublic int interpret(Context context) {return left.interpret(context) - right.interpret(context);}
}
/*** 乘法表达式——乘法表达式也是数值表达式的一种*/
public class MultiplicationExpression extends NumberExpression{private NumberExpression left;private NumberExpression right;public MultiplicationExpression(NumberExpression left, NumberExpression right) {super(3);this.left = left;this.right = right;}@Overridepublic int interpret(Context context) {return left.interpret(context) * right.interpret(context);}
}
/*** 除法表达式——除法表达式也是数值表达式的一种*/
public class DivisionExpression extends NumberExpression{private NumberExpression left;private NumberExpression right;public DivisionExpression(NumberExpression left, NumberExpression right) {super(4);this.left = left;this.right = right;}@Overridepublic int interpret(Context context) {return left.interpret(context) / right.interpret(context);}
}
- 上下文类(context)
public class Context {Expression expression;public Context(String expression) {Expression parse = init(expression);this.expression = parse;}public int calculate(){return this.expression.interpret(this);}private Expression init(String expression) {LinkedList<Expression> linkedList = new LinkedList<Expression>();int num = 0;for(int i=0;i<expression.length();i++) {char ati;if((ati=expression.charAt(i))>='0' && ati<='9') {num = num*10 + (ati-'0');}else {addNum(linkedList, num);SymbolExpression symbolExpression = null;switch (ati) {case '+':symbolExpression = new SymbolExpression(1);break;case '-':symbolExpression = new SymbolExpression(2);break;case '*':symbolExpression = new SymbolExpression(3);break;case '/':symbolExpression = new SymbolExpression(4);break;default:break;}num = 0;linkedList.addLast(symbolExpression);}}addNum(linkedList, num);return getExpression(linkedList);}/*** 添加num* @param linkedList* @param num*/private void addNum(LinkedList<Expression> linkedList,int num) {NumberExpression numberExpression = new NumberExpression(num);if(!linkedList.isEmpty()) {Expression symbol = linkedList.pollLast();if(symbol.interpret(this)==1 || symbol.interpret(this)==2) {linkedList.addLast(symbol);}else {NumberExpression left = (NumberExpression)linkedList.pollLast();NumberExpression right = numberExpression;if(symbol.interpret(this)==3) {numberExpression = new MultiplicationExpression(left, right);}else {numberExpression = new DivisionExpression(left, right);}}}linkedList.add(numberExpression);}/*** 获取Expression* @param linkedList* @return*/private Expression getExpression(LinkedList<Expression> linkedList){SymbolExpression symbolExpression = null;NumberExpression left = null;while(!linkedList.isEmpty()){Expression tempExpression = linkedList.pollFirst();if(tempExpression instanceof SymbolExpression){symbolExpression = (SymbolExpression)tempExpression;}else{if(left==null){left = (NumberExpression)tempExpression;}else{NumberExpression right = (NumberExpression)tempExpression;switch (symbolExpression.interpret(this)) {case 1:left = new AdditionExpression(left, right);break;case 2:left = new SubtractExpression(left, right);break;case 3:left = new MultiplicationExpression(left, right);break;case 4:left = new DivisionExpression(left, right);break;default:break;}}}}return left;}
}
- 客户端调用
public static void main(String[] args) {Context context = new Context("33+12*9+42/2+6/3");int calculate = context.calculate();System.out.println("计算结果:calculate:"+calculate);
}
- 结果

更多设计模式学习:
设计模式(1):介绍
设计模式(2):单例模式
设计模式(3):工厂模式
设计模式(4):建造者模式
设计模式(5):原型模式
设计模式(6):桥接模式
设计模式(7):装饰器模式
设计模式(8):组合模式
设计模式(9):外观模式
设计模式(10):享元模式
设计模式(11):适配器模式
设计模式(12):代理模式
设计模式(13):模板方法模式
设计模式(14):命令模式
设计模式(15):迭代器模式
设计模式(16):观察者模式
设计模式(17):中介者模式
设计模式(18):状态模式
设计模式(19):策略模式
设计模式(20):责任链模式
设计模式(21):备忘录模式
设计模式持续更新中…
相关文章:
设计模式(22):解释器模式
解释器 是一种不常用的设计模式用于描述如何构成一个简单的语言解释器,主要用于使用面向对象语言开发的解释器和解释器设计当我们需要开发一种新的语言时,可以考虑使用解释器模式尽量不要使用解释器模式,后期维护会有很大麻烦。在项目中&…...
kubernetes docker版本安装测试
文章目录 测试环境kubernetes安装环境配置安装程序下载镜像初始化reset环境init构建kubernetes配置授权信息配置网络插件查看状态 简单实例测试 测试环境 [rootlocalhost ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)kubernetes安装 参考kuberneter文档…...
策略模式:灵活调整算法的设计精髓
在软件开发中,策略模式是一种行为型设计模式,它允许在运行时选择算法的行为。通过定义一系列算法,并将每个算法封装起来,策略模式使得算法可以互换使用,这使得算法可以独立于使用它们的客户。本文将详细介绍策略模式的…...
[INS-30014]无法检查指定的位置是否位于 CFS 上
文章目录 一、具体错误二、通用解决方案1、可能的问题原因2、解决方案3、常见原因之hosts文件配置问题hosts配置方法hosts文件不可编辑解决办法 一、具体错误 在安装ORACLE19c的时候,出现无法检查指定的位置是否位于CFS上 二、通用解决方案 1、可能的问题原因 遇…...
机器学习和深度学习 -- 李宏毅(笔记与个人理解)Day 13
Day13 Error surface is rugged…… Tips for training :Adaptive Learning Rate critical point is not the difficult Root mean Square --used in Adagrad 这里为啥是前面的g的和而不是直接只除以当前呢? 这种方法的目的是防止学习率在训练过程中快速衰减。如果只用当前的…...
[Python图像识别] 五十二.水书图像识别 (2)基于机器学习的濒危水书古文字识别研究
该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。目前我进入第二阶段Python图像识别,该部分主要以目标检测、图像…...
Jmeter针对多种响应断言的判断
有时候response返回的结果并非一种,有多种,需要对这几种进行判断的时候需要使用Bean Shell。 (1)首先获取响应数据 String response prev.getResponseDataAsString(); ResponseCode 响应状态码 responseHeaders 响应头信息 res…...
Harmony鸿蒙南向驱动开发-Regulator接口使用
功能简介 Regulator模块用于控制系统中某些设备的电压/电流供应。在嵌入式系统(尤其是手机)中,控制耗电量很重要,直接影响到电池的续航时间。所以,如果系统中某一个模块暂时不需要使用,就可以通过Regulato…...
【opencv】示例-grabcut.cpp 使用OpenCV库的GrabCut算法进行图像分割
left mouse button - set rectangle SHIFTleft mouse button - set GC_FGD pixels CTRLleft mouse button - set GC_BGD pixels 这段代码是一个使用OpenCV库的GrabCut算法进行图像分割的C程序。它允许用户通过交互式方式选择图像中的一个区域,并利用GrabCut算法尝试…...
GEE数据集——巴基斯坦国家级土壤侵蚀数据集(2005 年和 2015 年)
简介 巴基斯坦国家级土壤侵蚀数据集(2005 年和 2015 年) 该数据集采用修订的通用土壤流失方程 (RUSLE),并考虑了六个关键影响因素:降雨侵蚀率 (R)、土壤可侵蚀性 (K)、坡长 (L)、坡陡 (S)、覆盖管理 (C) 和保护措施 (P)ÿ…...
服务器代理
服务器代理 配置:64G内存1 3090(24g)1P4000(8g) SSH连接 工作路径:/home/ubuntu/workspace/python Anaconda路径:/home/Ubuntu 1.在工作路径下创建自己的文件夹作为workspace 2.以用户ubunbtu登…...
【SGDR】《SGDR:Stochastic Gradient Descent with Warm Restarts》
arXiv-2016 code: https://github.com/loshchil/SGDR/blob/master/SGDR_WRNs.py 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method5 Experiments5.1 Datasets and Metric5.2 Single-Model Results5.3 Ensemble Results5.4 Experiment…...
如何将arping以及所有依赖打包安装到另外一台离线ubuntu机器
ubuntu系统下可以使用arping命令检测局域网内一些ip是否冲突,使用方式为: arping xx.xx.xx.xx 在线情况下,可以使用下面命令下载arping,然后使用即可 apt install arping 但是有些情况下机器可能不能上网,这时就需要将…...
mac上如何安装python3
mac上如何安装python3? 安装homebrew 在终端执行命令 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 执行完成后,homebrew和pip等工具就自动安装好了。 接下来安装python3.在终端…...
Java 那些诗一般的 数据类型 (下篇)
本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接…...
WEB3.0:互联网的下一阶段
随着互联网的发展,WEB3.0时代正在逐步到来。本文将深入探讨WEB3.0的定义、特点、技术应用以及未来展望,为读者带来全新的思考。 一、什么是WEB3.0? WEB3.0可以被理解为互联网发展的下一阶段,是当前WEB2.0的升级版。相较于2.0时代…...
Fastgpt配合chatglm+m3e或ollama+m3e搭建个人知识库
概述: 人工智能大语言模型是近年来人工智能领域的一项重要技术,它的出现标志着自然语言处理领域的重大突破。这些模型利用深度学习和大规模数据训练,能够理解和生成人类语言,为各种应用场景提供了强大的文本处理能力。AI大语言模…...
如何使用选择器精确地控制网页中每一个元素的样式?
1. 基础知识 什么是 CSS 元素选择器 CSS 元素选择器是一种在网页中通过元素类型来应用样式的方法。 简单来说,它就像是一个指挥棒,告诉浏览器哪些 HTML 元素需要应用我们定义的 CSS 样式规则。 为何要使用 CSS 元素选择器 使用元素选择器可以让我们…...
各个微前端框架的优劣浅谈
各个微前端框架都有其独特的优势和劣势,下面我将针对几个主流的微前端框架进行简要的优劣分析: single-spa 优势: 轻量级:single-spa是一个非常轻量级的微前端框架,它主要提供了一个加载和管理微应用的机制,…...
自动化运维(二十二)Ansible实战 之Jenkins模块
Ansible提供了一些模块,可以用来与Jenkins进行交互,执行各种操作,如创建任务、触发构建、获取构建结果等。通过使用这些模块,我们可以将Jenkins的配置和管理集成到Ansible的自动化流程中。 以下是一些常用的Ansible Jenkins模块: 1、jenkins_job模块 jenkins_job模块用于创建…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙
WebGL:在浏览器中解锁3D世界的魔法钥匙 引言:网页的边界正在消失 在数字化浪潮的推动下,网页早已不再是静态信息的展示窗口。如今,我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室,甚至沉浸式的V…...
