Java设计模式之解释器模式详解

Java设计模式之解释器模式详解


一、解释器模式核心思想

核心目标定义语言的文法规则,并构建解释器来解释语言中的句子。如同编译器将源代码转换为可执行代码,解释器模式将领域特定语言(DSL)的表达式解释为可执行操作。


二、解释器模式类图(Mermaid)

组合
«interface»
AbstractExpression
+interpret(Context) : int
TerminalExpression
+interpret(Context) : int
NonterminalExpression
-left: AbstractExpression
-right: AbstractExpression
+interpret(Context) : int
Context
-variables: Map
+getValue(String) : int
+setValue(String, int)
Client

三、代码实现示例

1. 简单数学表达式求值

import java.util.HashMap;
import java.util.Map;// 上下文:存储变量值
class Context {private Map<String, Integer> variables = new HashMap<>();public void setVariable(String name, int value) {variables.put(name, value);}public int getVariable(String name) {return variables.getOrDefault(name, 0);}
}// 抽象表达式
interface Expression {int interpret(Context context);
}// 终结符表达式:变量
class Variable implements Expression {private String name;public Variable(String name) {this.name = name;}public int interpret(Context context) {return context.getVariable(name);}
}// 终结符表达式:数字常量
class Constant implements Expression {private int value;public Constant(int value) {this.value = value;}public int interpret(Context context) {return value;}
}// 非终结符表达式:加法
class Add implements Expression {private Expression left;private Expression right;public Add(Expression left, Expression right) {this.left = left;this.right = right;}public int interpret(Context context) {return left.interpret(context) + right.interpret(context);}
}// 非终结符表达式:乘法
class Multiply implements Expression {private Expression left;private Expression right;public Multiply(Expression left, Expression right) {this.left = left;this.right = right;}public int interpret(Context context) {return left.interpret(context) * right.interpret(context);}
}// 客户端调用
public class Client {public static void main(String[] args) {// 创建上下文并设置变量Context context = new Context();context.setVariable("x", 5);context.setVariable("y", 8);// 构建表达式: (x + 3) * yExpression expression = new Multiply(new Add(new Variable("x"), new Constant(3)),new Variable("y"));int result = expression.interpret(context);System.out.println("计算结果: " + result); // 输出:计算结果: 64}
}

四、模式优缺点分析

✅ 优势

  • 扩展性好:易于扩展新的语法规则
  • 实现简单语法:适合简单语言解释
  • 领域特定语言:可定制业务专用语言

❌ 缺点

  • 复杂文法难维护:规则过多会导致类膨胀
  • 执行效率较低:解释执行比编译执行慢
  • 应用场景有限:仅适用于特定领域

五、典型应用场景

  1. 规则引擎:业务规则解析与执行
  2. SQL解析:解释SQL查询语句
  3. 正则表达式:模式匹配解释器
  4. 编译器设计:语法树解析
  5. 机器人指令:解释控制命令
  6. 金融公式计算:解释金融公式

六、Mermaid序列图(解释过程)

Client Expression Context Left Right interpret(context) getVariable() value result interpret(context) leftResult interpret(context) rightResult 计算(leftResult, rightResult) result alt [终结符表达式] [非终结符表达式] Client Expression Context Left Right

七、解释器模式 vs 其他模式

对比模式核心区别
组合模式构建树状结构,但不解释节点
访问者模式分离数据结构与操作
策略模式封装算法,不关注语法结构

八、实际框架应用案例

1. Spring表达式语言(SpEL)

ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("'Hello '.concat('World')");
String value = (String) exp.getValue(); // "Hello World"

2. Java正则表达式

Pattern pattern = Pattern.compile("a*b");  // 编译正则表达式
Matcher matcher = pattern.matcher("aaaaab");
boolean matches = matcher.matches();  // true

九、高级应用技巧

1. 语法树可视化

*
+
y
x
3

2. 添加更多运算符

// 减法运算
class Subtract implements Expression {private Expression left;private Expression right;public int interpret(Context context) {return left.interpret(context) - right.interpret(context);}
}// 除法运算
class Divide implements Expression {private Expression left;private Expression right;public int interpret(Context context) {int divisor = right.interpret(context);if (divisor == 0) throw new ArithmeticException();return left.interpret(context) / divisor;}
}

十、常见问题解答

Q1:解释器模式适合哪些文法类型?

最适合规则简单、变化少的文法,如:

  • 正则表达式
  • 布尔表达式
  • 简单数学表达式

Q2:如何处理复杂的文法规则?

对于复杂文法(如编程语言),通常需要:

  1. 使用词法分析器(如ANTLR)生成抽象语法树
  2. 结合访问者模式遍历语法树

Q3:如何优化解释器性能?

  • 预编译表达式:将表达式转换为中间代码
  • 缓存解释结果:对相同输入缓存结果
  • 使用JIT技术:运行时编译为本地代码
// 表达式缓存示例
class ExpressionCache {private Map<String, Expression> cache = new HashMap<>();public Expression getExpression(String expr) {return cache.computeIfAbsent(expr, this::parse);}private Expression parse(String expr) {// 解析字符串为表达式对象}
}

如果文章对你有帮助,请点关注支持一下吧!谢谢啦

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

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

相关文章

electron开发百度桌面应用demo及如何打包应用

1.开发入口文件main.js 1-1 加载百度URL const { app, BrowserWindow, nativeImage } require(electron) const path require(node:path)const createWindow () > {const win new BrowserWindow({width: 800,height: 600,})//加载百度URLwin.loadURL(https://www.baid…

LiveGBS海康、大华、宇视、华为摄像头GB28181国标语音对讲及语音喊话:摄像头设备与服务HTTPS准备

LiveGBS海康、大华、宇视、华为摄像头GB28181国标语音对讲及语音喊话&#xff1a;摄像头设备与服务HTTPS准备 1、背景2、准备工作2.1、服务端必备条件&#xff08;注意事项&#xff09;2.2、语音对讲设备准备2.2.1、大华摄像机2.2.2、海康摄像机 3、开启音频并开始对讲4、相关问…

JWT安全:假密钥.【签名随便写实现越权绕过.】

JWT安全&#xff1a;假密钥【签名随便写实现越权绕过.】 JSON Web 令牌 (JWT)是一种在系统之间发送加密签名 JSON 数据的标准化格式。理论上&#xff0c;它们可以包含任何类型的数据&#xff0c;但最常用于在身份验证、会话处理和访问控制机制中发送有关用户的信息(“声明”)。…

# Python 语音助手本地的ollama实现

项目简介 本项目是一个基于 Python 的智能语音助手&#xff0c;集成了语音录制、语音识别、AI对话和语音合成功能。用户可以通过语音与本地部署的 Ollama 大模型进行自然对话。 技术架构 核心功能模块 语音录制 - 使用 sounddevice 录制用户语音语音识别 - 使用 faster-whi…

第1章第1节:安全运维基础思维与体系建设-安全运维的定义与核心目标

&#x1f3af; 实战目标&#xff1a; 理解“安全运维”与传统运维的本质区别 掌握安全运维的核心目标与价值定位 建立以“持续可控、可视可审、自动响应”为核心的思维框架 &#x1f4d6; 背景知识&#xff1a; ✅ 传统运维 vs 安全运维 传统运维关注&#xff1a;系统稳定、…

LNMP 架构部署

目录 一、基于授权的访问控制 &#xff08;一&#xff09;功能简介 &#xff08;二&#xff09;配置步骤 二、基于客户端的访问控制 &#xff08;一&#xff09;功能简介 &#xff08;二&#xff09;配置步骤 三、Nginx 虚拟主机 &#xff08;一&#xff09;基于域名的…

JVM与JMM深度解析:从Java 8到Java 21的演进

文章目录 第一部分&#xff1a;JVM基础概念与架构JVM是什么&#xff1f;JVM整体架构运行时数据区类加载机制执行引擎 第二部分&#xff1a;Java内存模型&#xff08;JMM&#xff09;什么是Java内存模型JMM的核心问题主内存与工作内存内存间交互操作重排序与happens-before原则v…

Docker 挂载卷并保存为容器

1 创建docker容器 使用镜像osrf/ros:humble-desktop-full-jammy创建并运行容器 sudo docker run -it --name ros2_humble osrf/ros:humble-desktop-full-jammy /ros_entrypoint.sh bash docker run -it -v d:\docker\ros2_humble:/root/ros2_ws osrf/ros:humble-desktop-fu…

无人机飞手共享接单平台

2025年&#xff0c;无人机已不再是“黑科技”的代名词。从农田喷洒到外卖配送&#xff0c;从航拍摄影到医疗急救&#xff0c;无人机正以惊人的速度渗透我们的生活。而在这场变革中&#xff0c; “无人机飞手共享接单平台” 成为连接技术与需求的核心枢纽。它不仅让专业飞手轻松…

【Web应用】若依框架:基础篇07功能详解-定时任务

文章目录 ⭐前言⭐一、讲解过程⭐二、动手实操⭐总结 标题详情作者JosieBook头衔CSDN博客专家资格、阿里云社区专家博主、软件设计工程师博客内容开源、框架、软件工程、全栈&#xff08;,NET/Java/Python/C&#xff09;、数据库、操作系统、大数据、人工智能、工控、网络、程序…

8.8 Primary ODSA service without ODSA Portal

主要ODSA服务&#xff08;不使用ODSA门户&#xff09; 以下场景描述如下情况&#xff1a; • 主ODSA客户端应用程序被允许用于该类型的主设备&#xff0c;且对终端用户启用&#xff08;已授权&#xff09;。 • 服务提供商&#xff08;SP&#xff09;能够在不涉及ODSA门户Web服…

深度检测与动态透明度控制 - 基于Babylon.js的遮挡检测实现解析

首先贴出实现代码&#xff1a; OcclusionFader.ts import { AbstractEngine, Material, type Behavior, type Mesh, type PBRMetallicRoughnessMaterial, type Scene } from "babylonjs/core"; import { OcclusionTester } from "../../OcclusionTester"…

openssl 使用生成key pem

好的&#xff0c;以下是完整的步骤&#xff0c;帮助你在 Windows 系统中使用 OpenSSL 生成私钥&#xff08;key&#xff09;和 PEM 文件。假设你的 openssl.cnf 配置文件位于桌面。 步骤 1&#xff1a;打开命令提示符 按 Win R 键&#xff0c;打开“运行”对话框。输入 cmd&…

音视频之视频压缩及数字视频基础概念

系列文章&#xff1a; 1、音视频之视频压缩技术及数字视频综述 一、视频压缩编码技术综述&#xff1a; 1、信息化与视频通信&#xff1a; 什么是信息&#xff1a; 众所周知&#xff0c;人类社会的三大支柱是物质、能量和信息。具体而言&#xff0c;农业现代化的支柱是物质&…

传统数据表设计与Prompt驱动设计的范式对比:以NBA投篮数据表为例

引言&#xff1a;数据表设计方法的演进 在数据库设计领域&#xff0c;传统的数据表设计方法与新兴的Prompt驱动设计方法代表了两种截然不同的思维方式。本文将以NBA赛季投篮数据表(shots)的设计为例&#xff0c;深入探讨这两种方法的差异、优劣及适用场景。随着AI技术在数据领…

XCTF-web-mfw

发现了git 使用GitHack下载一下源文件&#xff0c;找到了php源代码 <?phpif (isset($_GET[page])) {$page $_GET[page]; } else {$page "home"; }$file "templates/" . $page . ".php";// I heard .. is dangerous! assert("strpos…

Prompt Tuning与自然语言微调对比解析

Prompt Tuning 与输入提示词自然语言微调的区别和联系 一、核心定义与区别 维度Prompt Tuning(提示微调)输入提示词自然语言微调本质优化连续向量空间中的提示嵌入(不可直接阅读)优化离散自然语言文本(人类可理解)操作对象模型输入嵌入层的连续向量(如WordEmbedding)自…

LVS的DR模式部署

目录 一、引言&#xff1a;高并发场景下的流量调度方案 二、LVS-DR 集群核心原理与架构设计 &#xff08;一&#xff09;工作原理与数据流向 数据包流向步骤3&#xff1a; &#xff08;二&#xff09;模式特性与53网络要求 三、实战配置&#xff1a;从9环境搭建到参数调整…

8种常见数据结构及其特点简介

一、8种常见数据结构 1. 数组&#xff08;Array&#xff09; 简介&#xff1a;数组是有序元素的序列&#xff0c;连续内存块存储相同类型元素&#xff0c;通过下标直接访问。数组会为存储的元素都分配一个下标&#xff08;索引&#xff09;&#xff0c;此下标是一个自增连续的…

通过mailto:实现web/html邮件模板唤起新建邮件并填写内容

一、背景 在实现网站、html邮件模板过程中&#xff0c;难免会遇到需要通过邮箱向服务提供方发起技术支持等需求&#xff0c;因此&#xff0c;我们需要通过一个功能&#xff0c;能新建邮件并提供模板&#xff0c;提高沟通效率 二、mailto协议配置说明 参数描述mailto:nameema…