当前位置: 首页 > news >正文

Java设计模式之行为型模式(解释器模式)实现方式详解

解释器模式是一种行为型设计模式,用于定义一种语言的文法,并且构建一个解释器来解释该语言中的句子。这种模式常用于处理简单语言的语法解析。

下面是一个简单的例子,使用Java实现一个基本的四则运算表达式求值器(仅支持加减乘除和括号)。

示例场景:

我们希望创建一个简单的数学表达式求值器,它可以解析并计算像 “3 + 5 * (10 - 4)” 这样的字符串表达式。

解释器模式的核心组件包括:

  • 抽象表达式(Abstract Expression): 声明一个抽象的解释操作。
  • 终结符表达式(Terminal Expression): 实现与文法规则中终结符相关的解释操作。
  • 非终结符表达式(Nonterminal Expression): 为文法规则中的非终结符声明一个解释操作。
  • 上下文(Context): 包含解释器之外的一些全局信息。

下面是具体的代码实现:

import java.util.Stack;
// 抽象表达式接口
interface Expression {int interpret();
}
// 终结符表达式:数字
class NumberExpression implements Expression {private final int number;public NumberExpression(int number) {this.number = number;}@Overridepublic int interpret() {return number;}
}
// 非终结符表达式基类:二元操作符
abstract class BinaryOperation implements Expression {protected final Expression leftOperand;protected final Expression rightOperand;public BinaryOperation(Expression leftOperand, Expression rightOperand) {this.leftOperand = leftOperand;this.rightOperand = rightOperand;}
}
// 加法操作
class AddExpression extends BinaryOperation {public AddExpression(Expression leftOperand, Expression rightOperand) {super(leftOperand, rightOperand);}@Overridepublic int interpret() {return leftOperand.interpret() + rightOperand.interpret();}
}
// 减法操作
class SubtractExpression extends BinaryOperation {public SubtractExpression(Expression leftOperand, Expression rightOperand) {super(leftOperand, rightOperand);}@Overridepublic int interpret() {return leftOperand.interpret() - rightOperand.interpret();}
}
// 乘法操作
class MultiplyExpression extends BinaryOperation {public MultiplyExpression(Expression leftOperand, Expression rightOperand) {super(leftOperand, rightOperand);}@Overridepublic int interpret() {return leftOperand.interpret() * rightOperand.interpret();}
}
// 除法操作
class DivideExpression extends BinaryOperation {public DivideExpression(Expression leftOperand, Expression rightOperand) {super(leftOperand, rightOperand);}@Overridepublic int interpret() {if (rightOperand.interpret() == 0) {throw new ArithmeticException("Cannot divide by zero");}return leftOperand.interpret() / rightOperand.interpret();}
}
public class InterpreterPatternDemo {// 表达式的解析方法public static Expression parse(String expression) {Stack stack = new Stack<>();String[] tokens = expression.split("\\s+");for (String token : tokens) {switch (token) {case "+":Expression addRight = stack.pop();Expression addLeft = stack.pop();stack.push(new AddExpression(addLeft, addRight));break;case "-":Expression subRight = stack.pop();Expression subLeft = stack.pop();stack.push(new SubtractExpression(subLeft, subRight));break;case "*":Expression mulRight = stack.pop();Expression mulLeft = stack.pop();stack.push(new MultiplyExpression(mulLeft, mulRight));break;case "/":Expression divRight = stack.pop();Expression divLeft = stack.pop();stack.push(new DivideExpression(divLeft, divRight));break;default:stack.push(new NumberExpression(Integer.parseInt(token)));break;}}return stack.pop();}public static void main(String[] args) {String expression = "3 + 5 * (10 - 4)";Expression parsedExpression = parse(expression.replaceAll("\\(", "").replaceAll("\\)", ""));System.out.println("Parsed expression: " + expression);System.out.println("Result: " + parsedExpression.interpret());}
}

说明:
在这个例子中,我们实现了四种基本的操作:加、减、乘、除。每个操作都被表示为一个实现了 Expression 接口的具体类。通过栈的数据结构,我们可以方便地对表达式进行解析和计算。

http://www.lryc.cn/news/606675.html

相关文章:

  • RabbitMQ 延时队列插件安装与使用详解(基于 Delayed Message Plugin)
  • 在uni-app中引入本地日志插件
  • 开发者体验如何度量?
  • android APT技术
  • 嵌入式系统教学范式演进:云端仿真平台如何重构温湿度监测实验教学
  • JavaScript语法树简介:AST/CST/词法/语法分析/ESTree/生成工具
  • 2025 腾讯广告算法大赛 Baseline 项目解析
  • gd32modbus从机移植
  • 烽火HG680-KX-海思MV320芯片-2+8G-安卓9.0-强刷卡刷固件包
  • 关税战火中的技术方舟:新西兰证券交易所的破局之道 ——从15%关税冲击到跨塔斯曼结算联盟,解码下一代交易基础设施
  • VSCode:通义灵码插件安装使用 -- 免费AI编程工具
  • 高端房产管理小程序
  • C++继承中虚函数调用时机问题及解决方案
  • Spring框架下的中医针灸系统实现
  • 使用uniapp开发小程序-【引入字体并全局使用】
  • 1.6万 Star 的流行容器云平台停止开源
  • GitHub 趋势日报 (2025年07月31日)
  • hadoop.yarn 带时间的LRU 延迟删除
  • 【实战】Dify从0到100进阶--插件开发(1)Github爬取插件
  • 【2025/08/01】GitHub 今日热门项目
  • 24 SAP CPI 调用SAP HTTP接口
  • R语言基础图像及部分调用函数
  • Dify API接口上传文件 postman配置
  • osloader!DoGlobalInitialization函数分析之HW_CURSOR--NTLDR源代码分析之设置光标
  • django操作orm整套
  • 学习设计模式《二十》——解释器模式
  • 如何使用Postman做接口测试
  • curl命令使用
  • 【机器学习与数据挖掘实战 | 医疗】案例20:基于交叉验证和LightGBM算法的糖尿病遗传风险预测
  • 机器学习②【字典特征提取、文本特征处理(TF-IDF)、数据标准化与归一化、特征降维】