解释器模式_行为型_GOF23
解释器模式
解释器模式(Interpreter Pattern)是一种行为型设计模式,核心思想是定义语言的文法规则,并构建一个解释器来解析和执行该语言中的表达式。它类似于“翻译器”——将符合特定语法规则的文本(如数学公式、脚本指令)转换为可执行的逻辑或计算结果,而无需直接硬编码解析逻辑。
一、通俗理解
假设你开发一个计算器程序:
- 传统方式:直接解析
"3+4*2"字符串,需处理运算符优先级、括号嵌套等复杂逻辑,代码臃肿且难以扩展。 - 解释器模式:
- 表达式类(如
Add、Multiply)表示文法规则,每个类封装一个操作。 - 解释器将表达式字符串解析为树形结构(如
3 + (4 * 2)),递归调用各节点计算最终结果。
这样新增运算符(如指数运算)只需添加新表达式类,无需修改核心逻辑。
- 表达式类(如
二、模式结构
解释器模式包含以下角色:
- 抽象表达式(Expression):定义
interpret()接口,声明解释操作。 - 终结符表达式(TerminalExpression):处理语法中的基础元素(如数字、变量)。
- 非终结符表达式(NonTerminalExpression):处理组合结构(如运算符、逻辑语句),通常包含其他表达式对象。
- 上下文(Context):存储解释过程中需要的全局信息(如变量值)。
- 客户端(Client):构建表达式树并触发解释过程。
三、适用场景
- 数学表达式求值:如计算器、公式引擎。
- 领域特定语言(DSL):如游戏脚本、配置文件解析。
- 规则引擎:如业务规则判断(如
"年龄>18 && 信用分>60")。 - 简单语法解析:如正则表达式、SQL条件子句。
不适用场景:
- 语法过于复杂(如完整编程语言),此时需专业解析工具(如ANTLR)。
- 对性能要求极高,因递归解释可能导致效率问题。
四、代码实现
1. C++ 示例(数学表达式求值)
#include <iostream>
#include <map>
#include <string> // 抽象表达式
class Expression {
public: virtual int interpret(const std::map<std::string, int>& context) = 0; virtual ~Expression() = default;
}; // 终结符表达式:数字
class Number : public Expression { int value;
public: Number(int v) : value(v) {} int interpret(const std::map<std::string, int>&) override { return value; }
}; // 非终结符表达式:加法
class Add : public Expression { Expression* left; Expression* right;
public: Add(Expression* l, Expression* r) : left(l), right(r) {} int interpret(const std::map<std::string, int>& ctx) override { return left->interpret(ctx) + right->interpret(ctx); } ~Add() { delete left; delete right; }
}; // 客户端
int main() { // 表达式:2 + (3 + 5) Expression* expr = new Add(new Number(2), new Add(new Number(3), new Number(5))); std::map<std::string, int> context; // 本例未使用变量 std::cout << "结果: " << expr->interpret(context); // 输出:10 delete expr; return 0;
}
解析:
Add组合左右表达式,递归计算值。- 扩展减法只需新增
Subtract类。
2. Python 示例(逻辑条件判断)
from abc import ABC, abstractmethod class Expression(ABC): @abstractmethod def interpret(self, context): pass # 终结符:变量值
class Variable(Expression): def __init__(self, name): self.name = name def interpret(self, context): return context.get(self.name, False) # 非终结符:逻辑或
class Or(Expression): def __init__(self, expr1, expr2): self.expr1 = expr1 self.expr2 = expr2 def interpret(self, context): return self.expr1.interpret(context) or self.expr2.interpret(context) # 客户端
context = {"A": True, "B": False}
expr = Or(Variable("A"), Variable("B"))
print(expr.interpret(context)) # 输出:True
特点:
- 支持动态条件组合(如
A || (C && D))。
3. Java 示例(四则运算解析器)
import java.util.Stack; // 抽象表达式
interface Expression { int interpret();
} // 终结符:数字
class Number implements Expression { private int value; public Number(int v) { this.value = v; } public int interpret() { return value; }
} // 非终结符:加法
class Add implements Expression { private Expression left, right; public Add(Expression l, Expression r) { this.left = l; this.right = r; } public int interpret() { return left.interpret() + right.interpret(); }
} // 客户端构建表达式树
public class Client { public static void main(String[] args) { // 表达式: (5 + 3) - (2 * 4) Expression expr = new Subtract( new Add(new Number(5), new Number(3)), new Multiply(new Number(2), new Number(4)) ); System.out.println("结果: " + expr.interpret()); // 输出:8 - 8 = 0 }
}
扩展性:
- 新增
Multiply、Divide类即可支持更多运算符。
五、优缺点分析
| 优点 | 缺点 |
|---|---|
| 1. 灵活扩展语法:新增规则只需添加类 | 1. 类膨胀:每个语法规则对应一个类 |
| 2. 解耦解析与执行:逻辑清晰易维护 | 2. 性能瓶颈:递归解释效率较低 |
| 3. 支持复杂表达式:树形结构处理嵌套逻辑 | 3. 不适合复杂文法:需专业解析工具 |
六、总结
解释器模式通过语法树将文本指令转化为可执行逻辑,其核心价值在于:
- 抽象与封装:分离语法定义与解析逻辑,提升代码可读性。
- 领域适应性:为特定场景(如规则引擎、公式计算)提供轻量级解析方案。
- 实际应用:Spring表达式语言(SpEL)、正则表达式引擎均基于此模式。
扩展思考:
- 结合组合模式构建复杂语法树。
- 使用预编译或缓存优化解释性能。
相关文章:
解释器模式_行为型_GOF23
解释器模式 解释器模式(Interpreter Pattern)是一种行为型设计模式,核心思想是定义语言的文法规则,并构建一个解释器来解析和执行该语言中的表达式。它类似于“翻译器”——将符合特定语法规则的文本(如数学公式、脚本…...
OTN(Optical Transport Network)详解
OTN(光传送网)是一种基于**波分复用(WDM)**的大容量光传输技术,结合了SDH的运维管理优势和WDM的高带宽特性,广泛应用于骨干网、城域核心层及数据中心互联(DCI)。 1. OTN 的基本概念 …...
YOLOv8+ Deepsort+Pyqt5车速检测系统
该系统通过YOLOv8进行高效的目标检测与分割,结合DeepSORT算法完成目标的实时跟踪,并利用GPU加速技术提升处理速度。系统支持模块化设计,可导入其他权重文件以适应不同场景需求,同时提供自定义配置选项,如显示标签和保存…...
【干货】前端实现文件保存总结
⚠️⚠️文前推荐一下👉 前端必备工具推荐网站(图床、API和ChatAI、智能AI简历、AI思维导图神器等实用工具): 站点入口:http://luckycola.com.cn/ 前端实现文件保存实现总结 在Web开发中,文件下载是常见的交互需求。本文将系统总结前端实现文…...
并发编程之FutureTask.get()阻塞陷阱:深度解析线程池CPU飚高问题排查与解决方案
FutureTask.get方法阻塞陷阱:深度解析线程池CPU飚高问题排查与解决方法 FutureTask.get()方法阻塞陷阱:深度解析线程池CPU飚高问题排查与解决方法1、情景复现1.1 线程池工作原理1.2 业务场景模拟1.3 运行结果1.4 发现问题:线程池没有被关闭1.…...
DGNN-YOLO:面向遮挡小目标的动态图神经网络检测与追踪方法解析
一、算法结构与核心贡献 1.1 文章结构 采用经典五段式结构: 引言:分析智能交通系统(ITS)中小目标检测与追踪的挑战,提出研究动机。相关工作:综述小目标检测(YOLO系列、Faster R-CNN)、目标追踪(SORT、Transformer)和图神经网络(GNN)的进展。方法论:提出DG…...
在Ubuntu中固定USB设备的串口号
获取设备信息 lsusb # 记录设备的Vendor ID和Product ID(例如:ID 0403:6001)# 获取详细属性(替换X和Y为实际设备号) udevadm info -a /dev/ttyUSBX 结果一般如下 创建udev规则文件 sudo gedit /etc/udev/rules.d/us…...
javaSE————文件IO(2)、
文件内容的读写——数据流 我们对于文件操作使用流对象Stream来操作,什么是流对象呢,水流是什么样的,想象一下,水流的流量是多种的,可以流100ml,也可以流1ml,流对象就和水流很像,我…...
前端常问的宏观“大”问题详解(二)
JS与TS选型 一、为什么选择 TypeScript 而不是 JavaScript? 1. 静态类型系统:核心优势 TypeScript 的静态类型检查能在 编译阶段 捕获类型错误(如变量类型不匹配、未定义属性等),显著减少运行时错误风险。例如&…...
[创业之路-343]:创业:一场认知重构与组织进化的双向奔赴
目录 前言:关键词: 一、重构企业认知框架: 1、认知框架的顶层设计——六大维度生态模型 2、认知重构的精密设计——五层结构化模型 第一层:战略层(脑) 第二层:运营层(躯干&…...
智慧电力:点亮未来能源世界的钥匙
在科技日新月异的今天,电力行业正经历着前所未有的变革。智慧电力,作为这一变革的核心驱动力,正逐步改变着我们对电力的认知和使用方式。它不仅是电力行业的一次技术革新,更是推动社会可持续发展、实现能源高效利用的重要途径。 智…...
架构师面试(二十三):负载均衡
问题 今天我们聊微服务相关的话题。 大中型微服务系统中,【负载均衡】是一个非常核心的组件;在微服务系统的不同位置对【负载均衡】进行了实现,下面说法正确的有哪几项? A. LVS 的负载均衡一般通过前置 F5 或是通过 VIP keepa…...
CSS3学习教程,从入门到精通, CSS3 列表控制详解语法知识点及案例代码(24)
CSS3 列表控制详解 CSS 列表控制的语法知识点及案例代码的详细说明,包括 list-style-type、list-style-image、list-style-position 和 list-style 的用法。 1. list-style-type 属性 list-style-type 属性用于设置列表项标记的类型。 语法 list-style-type: v…...
NSSCTF(MISC)—[justCTF 2020]pdf
相应的做题地址:https://www.nssctf.cn/problem/920 binwalk分离 解压文件2AE59A.zip mutool 得到一张图片 B5F31内容 B5FFD内容 转换成图片 justCTF{BytesAreNotRealWakeUpSheeple}...
坚持“大客户战略”,昂瑞微深耕全球射频市场
北京昂瑞微电子技术股份有限公司(简称“昂瑞微”)是一家聚焦射频与模拟芯片设计的高新技术企业。随着5G时代的全面到来,智能手机、智能汽车等终端设备对射频前端器件在通信频率、多频段支持、信道带宽及载波聚合等方面提出了更高需求…...
LiteDB 数据库优缺点分析与C#代码示例
LiteDB 是一个轻量级的 .NET NoSQL 嵌入式数据库,完全用 C# 开发,支持跨平台(Windows、Linux、MacOS),并提供类似于 MongoDB 的简单 API。它以单文件形式存储数据,类似于 SQLite,支持事务和 ACID 特性,确保数据的一致性和可靠性。 优缺点分析 优点: 轻量级与嵌入式:…...
上海SMT贴片技术解析与行业趋势
内容概要 随着长三角地区电子制造产业集群的快速发展,上海作为核心城市正引领着SMT贴片技术的革新浪潮。本文聚焦表面组装技术在高密度互连、微间距贴装等领域的突破性进展,通过解析焊膏印刷精度控制、元件定位算法优化等核心工艺,展现上海企…...
HTML5和CSS3的一些特性
HTML5 和 CSS3 是现代网页设计的基础技术,它们引入了许多新特性和功能,极大地丰富了网页的表现力和交互能力。 HTML5 的一些重要特性包括: 新的语义化标签: HTML5 引入了一些重要的语义化标签如 <header>, <footer>, <articl…...
Linux系统中快速安装docker
1 查看是否安装docker 要检查Ubuntu是否安装了Docker,可以使用以下几种方法: 方法1:使用 docker --version 命令 docker --version如果Docker已安装,输出会显示Docker的版本信息,例如: Docker version …...
每日c/c++题 备战蓝桥杯(最长上升子序列)
点击题目链接 题目描述 给出一个由 n(n≤5000) 个不超过 1e6 的正整数组成的序列。请输出这个序列的最长上升子序列的长度。 最长上升子序列是指,从原序列中按顺序取出一些数字排在一起,这些数字是逐渐增大的。 输入格式 第一行,一个整数…...
蓝桥杯—质数
质数 质数是一个只有1和它本身2个因数 代码实现 //求质数 #include<bits/stdc.h> using namespace std; bool zhishu(int n) {if(n1){cout<<"1不是质数";return false;}else if(n>1){for(int i2;i<sqrt(n);i){if(n%i0){cout<<n<<&q…...
CP15 协处理器
ARMv7-A 一共支持 16 个协处理器,编号从 CP0~CP15。这里仅对CP15进行描述。 1、ARMv7-A 协处理器 ARMv7-A 处理器除了标准的 R0~R15,CPSR,SPSR 以外,由于引入了 MMU、TLB、Cache 等内容,ARMv7-A 使用协处理器来对这些…...
网络运维学习笔记(DeepSeek优化版)026 OSPF vlink(Virtual Link,虚链路)配置详解
文章目录 OSPF vlink(Virtual Link,虚链路)配置详解1. 虚链路核心特性2. 基础配置命令3. 状态验证命令3.1 查看虚链路状态3.2 验证LSDB更新 4. 关键技术要点4.1 路径选择机制4.2 虚链路的链路优化 5. 环路风险案例 OSPF vlink(Virtual Link&a…...
简单介绍一下Unity中的material和sharedMaterial
在Unity中,材质(Material)是定义物体外观的关键组件,它决定了物体的颜色、纹理、光照效果等属性。Renderer组件(如MeshRenderer或SpriteRenderer)通过材质来渲染游戏对象的外观。Unity提供了两种访问材质的…...
小智机器人关键函数解析,Application::MainLoop() 用于持续监听事件组中的事件,并根据不同的事件触发相应的操作
以下是对 Application::MainLoop() 函数的详细解释: 源码: // The Main Loop controls the chat state and websocket connection // If other tasks need to access the websocket or chat state, // they should use Schedule to call this function …...
设计模式之适配器模式(二):STL适配器
目录 1.背景 2.什么是 STL 适配器? 3.函数对象适配器 3.1.std::bind 3.2.std::not1 和 std::not2 3.3.std::mem_fn 4.容器适配器 4.1.std::stack(栈) 4.2.std::queue(队列) 4.3.std::priority_queue(优先队列࿰…...
【区块链安全 | 第十六篇】类型之值类型(三)
文章目录 函数类型声明语法转换成员合约更新时的值稳定性示例 函数类型 函数类型是函数的类型。函数类型的变量可以通过函数进行赋值,函数类型的参数可以用来传递函数并返回函数。 函数类型有两种类型:内部函数和外部函数。 内部函数只能在当前合约内调…...
设计模式——设计模式理念
文章目录 参考:[设计模式——设计模式理念](https://mp.weixin.qq.com/s/IEduZFF6SaeAthWFFV6zKQ)参考:[设计模式——工厂方法模式](https://mp.weixin.qq.com/s/7tKIPtjvDxDJm4uFnqGsgQ)参考:[设计模式——抽象工厂模式](https://mp.weixin.…...
Kubernetes对象基础操作
基础操作 文章目录 基础操作一、创建Kubernetes对象1.使用指令式命令创建Deployment2.使用指令式对象配置创建Deployment3.使用声明式对象配置创建Deployment 二、操作对象的标签1.为对象添加标签2.修改对象的标签3.删除对象标签4.操作具有指定标签的对象 三、操作名称空间四、…...
Java与代码审计-Java基础语法
Java基础语法 package com.woniuxy.basic;public class HelloWorld {//入口函数public static void main(String[] args){System.out.println("Hello World");for(int i0;i< args.length;i){System.out.println(args[i]);}} }运行结果如下: 但是下面那个没有参数…...
