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
繁體地址,請注明出處:http://hk.pswp.cn/web/81688.shtml
英文地址,請注明出處:http://en.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…