Interpreter 设计模式

news/2025/1/15 15:45:04/文章来源:https://www.cnblogs.com/spicy-food/p/18411333

实际用途:简单的计算器

假设我们要实现一个简单的计算器,可以解析并计算基本的数学表达式,包括加法、减法、乘法和除法。这个计算器将能够处理表达式如 "3 + 5 * (2 - 8)"

使用解释器模式的代码示例

1. 表达式接口
java
interface Expression { int interpret(); }
2. 终结符表达式(数字)
java
class NumberExpression implements Expression { private int number; public NumberExpression(int number) { this.number = number; } @Override public int interpret() { return number; } }
3. 非终结符表达式(操作符)
java
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(); } } 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(); } } 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(); } } 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() { return left.interpret() / right.interpret(); } }
4. 构建表达式并计算
java
public class InterpreterCalculatorExample { public static void main(String[] args) { // 表达式: 3 + 5 * (2 - 8) Expression expr = new AddExpression( new NumberExpression(3), new MultiplyExpression( new NumberExpression(5), new SubtractExpression( new NumberExpression(2), new NumberExpression(8) ) ) ); System.out.println("Result: " + expr.interpret()); // 输出: Result: -13 } }

对比:未使用解释器模式的代码示例

假设我们不使用解释器模式,而是直接用常规的代码实现相同的功能,这里是一个不使用解释器模式的“差”代码示例。这个示例展示了代码如何随着需求的增加变得复杂和难以维护。

未使用解释器模式的代码

java
public class Calculator { public static int evaluate(String expression) { // 简化版本:仅支持单一操作符的表达式 // 实际代码可能需要解析和计算整个表达式 String[] tokens = expression.split(" "); int result = Integer.parseInt(tokens[0]); for (int i = 1; i < tokens.length; i += 2) { String operator = tokens[i]; int number = Integer.parseInt(tokens[i + 1]); switch (operator) { case "+": result += number; break; case "-": result -= number; break; case "*": result *= number; break; case "/": result /= number; break; default: throw new IllegalArgumentException("Invalid operator"); } } return result; } public static void main(String[] args) { // 示例表达式: 3 + 5 * 2 - 8 // 注意:这种方法仅能处理简单的表达式 System.out.println("Result: " + evaluate("3 + 5 * 2 - 8")); // 输出: Result: 10 } }

对比分析

  • 灵活性:使用解释器模式可以轻松扩展支持更多的操作符和复杂的表达式,而不需要改变现有的代码。未使用解释器模式的代码在处理更复杂的表达式时会变得非常困难,且难以维护。
  • 可读性和维护性:解释器模式通过将语法规则和执行逻辑分离,使代码更加清晰和易于维护。未使用解释器模式的代码会随着功能增加而变得更加复杂和难以理解。
  • 扩展性:使用解释器模式可以轻松地添加新的表达式和操作符,而不需要大幅修改现有代码。未使用解释器模式的代码在扩展功能时需要处理更多的条件和逻辑,增加了错误的风险。

通过这个对比,解释器模式展示了如何有效地管理和解析复杂的表达式,同时保持代码的灵活性和可维护性。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[极客大挑战 2019]LoveSQL 1

启动靶机作者不建议使用sqlmap我们这里就进行手工注入 用万能口令登录 admin or 1 =1# ,详情见上文(https://www.cnblogs.com/m1saka1/p/18411197) 登录成功获得用户名和密码,发现密码并没有卵用,只能换思路利用账号密码的回显页面进行sql注入爆破数据库 由于网站自动转义,…

Go日志管理库zap

一、zap介绍 在许多Go语言项目中,我们需要一个好的日志记录器能够提供下面这些功能: 1.能够将事件记录到文件中,而不是应用程序控制台。 2.日志切割-能够根据文件大小、时间或间隔等来切割日志文件。 3.支持不同的日志级别。例如INFO,DEBUG,ERROR等。 4.能够打印基本信息,…

深度神经网络DNN、RNN、RCNN及多种机器学习金融交易策略研究|附数据代码

全文链接:https://tecdat.cn/?p=37668 原文出处:拓端数据部落公众号 分析师:Aijun Zhang 在当今的金融领域,量化交易正凭借其科学性和高效性逐渐成为主流投资方式之一。随着大数据技术的蓬勃发展,量化交易借助先进的数学模型和计算机分析能力,摒弃了人的主观判断,通过…

第一次个人作业

这个作业属于哪个课程 班级的链接这个作业要求在哪里 作业要求的链接这个作业的目标 实现论文查重算法,并对代码进行性能分析、单元测试,使用PSP表GitHub链接 一、PSP表PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)Planning 计划 15 20Estimate 估…

mybatis exists 中使用代替in关键字

使用场景,in适合数据量小的时候,exists适合数据量大的时候。<if test="torqueRecordPageDTO.vinList != null and torqueRecordPageDTO.vinList.size >0">and exists (select 1 from (<foreach collection="torqueRecordPageDTO.vinList" it…

图与网络——TSP问题精解

旅行商问题(Travelling Salesman Problem, TSP)是组合优化领域中的经典问题之一。TSP的概念最早可以追溯到18世纪,瑞士数学家欧拉在解决柯尼斯堡七桥问题时首次提出了关于图中遍历的问题。不过,作为一个优化问题,TSP在19世纪才开始形成系统的研究。1920年代,TSP被德国数学…

[NLP/AIGC] 大语言模型:零一万物

1 概述:零一万物 - 首款开源中英双语大模型 公司背景公司名称:零一万物(01.AI) 创始人:李开复博士(知名投资人、创新工场董事长兼CEO)产品介绍产品名称:Yi 系列大模型Yi-6B:数据参数量为60亿的双语(英文/中文)开源模型 Yi-34B:数据参数量为340亿的双语(英文/中文)…

jackson 原生反序列化触发 getter 方法

jackson 原生反序列化触发 getter 方法jackson的POJONode方法可以任意调用getterjackson序列化会任意调用getter分析 jackson 序列化会调用任意 getter 方法,jackson 反序列化也会任意调用 getter ,这两个都不需要多说什么了,在前面的 jackson 反序列化中的 TemplatesImpl 链…

urllib发送get请求_中文传参问题

GET请求是HTTP协议中的一种基本方法,当需要在GET请求中传递中文参数时需要额外对中文进行编码(英文不需要),因为url中只能包含ascii字符。 可以使用urllib.parser.urlencode()或urllib.parse.quote()方法对中文转码。 详细查官方文档: https://docs.python.org/3.12/libra…

jackson 反序列化学习

jackson 反序列化学习 jackson 介绍 Jackson 是一个用于处理 JSON 数据的开源 Java 库。Spring MVC 的默认 json 解析器便是 Jackson。 Jackson 优点很多。 Jackson 所依赖的 jar 包较少,简单易用。与其他 Java 的 json 的框架 Gson 等相比, Jackson 解析大的 json 文件速度比…

LeetCode算法—递归

纵有疾风起;人生不言弃!一:递归 1、定义:函数直接或者间接的调用自己 2、四个要素 (1)接受的参数 (2)返回的值 (3)终止条件 (4)如何拆解 二:LeetCode 509 斐波那契数列 def func(n):if n<2:return nelse:return func(n-1)+func(n-2)n=int(input()) print(func(…

2024年9月最新Youtube转WAV高质量音频最新教程

​1.利用在线转换工具(最推荐的一种方式): YoutubeToWAV:打开浏览器,访问 https://www.youtubetowav.cc/的官方网站。在 YouTube 网站上找到您想要转换的视频,复制该视频的链接。回到网页,将复制的 YouTube 视频链接粘贴到指定的输入框中。点击Convert默认为audio标签的格…