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

C# 设计模式(行为型模式):解释器模式

C# 设计模式(行为型模式):解释器模式 (Interpreter Pattern)


什么是解释器模式?

解释器模式(Interpreter Pattern)是一种行为型设计模式,用于定义一种语言的语法表示,并提供一个解释器来解释这些语法。它通常用于构建简单的语言处理器或解析器,将特定的业务规则转化为代码可理解的语法结构。

在这种模式中,通过为语言中的每条规则定义一个类,解释器可以逐一解析输入并执行相应的操作。


一、解释器模式的核心概念
  1. 定义语言规则:将语言的每个规则(语法)封装为类。
  2. 逐条解释:通过递归或迭代的方式逐一解析和执行语法规则。
  3. 灵活性:可以轻松扩展规则,适合需求变化的场景。

二、模式结构

解释器模式包含以下几个核心角色:

  1. AbstractExpression(抽象表达式)
    定义一个接口,提供解释操作。

  2. TerminalExpression(终结符表达式)
    实现与语法规则中的终结符相关的操作。

  3. NonTerminalExpression(非终结符表达式)
    实现与语法规则中非终结符相关的操作,通常包含一个或多个表达式的引用。

  4. Context(上下文)
    存储解释器需要的全局信息。

  5. Client(客户端)
    负责构建语法树,并调用解释器解释语句。


三、适用场景
  • 配置文件解析:如简单的脚本语言或自定义配置格式的解析器。
  • 数学表达式求值:如解析和计算加减乘除表达式。
  • 正则表达式:解析和匹配字符串模式。
  • 简单脚本语言:如游戏中的规则引擎或 DSL(领域特定语言)。

四、C# 实现案例
1. 场景描述

假设我们需要解析和计算简单的数学表达式(如 “5 + 3 - 2”)。

2. 实现代码
using System;
using System.Collections.Generic;namespace InterpreterPattern
{// 抽象表达式abstract class Expression{public abstract int Interpret();}// 终结符表达式:数字class NumberExpression : Expression{private readonly int _number;public NumberExpression(int number){_number = number;}public override int Interpret(){return _number;}}// 非终结符表达式:加法class AddExpression : Expression{private readonly Expression _leftExpression;private readonly Expression _rightExpression;public AddExpression(Expression left, Expression right){_leftExpression = left;_rightExpression = right;}public override int Interpret(){return _leftExpression.Interpret() + _rightExpression.Interpret();}}// 非终结符表达式:减法class SubtractExpression : Expression{private readonly Expression _leftExpression;private readonly Expression _rightExpression;public SubtractExpression(Expression left, Expression right){_leftExpression = left;_rightExpression = right;}public override int Interpret(){return _leftExpression.Interpret() - _rightExpression.Interpret();}}// 客户端class Program{static void Main(string[] args){// 构建表达式树:5 + 3 - 2Expression number1 = new NumberExpression(5);Expression number2 = new NumberExpression(3);Expression number3 = new NumberExpression(2);Expression addExpression = new AddExpression(number1, number2);Expression subtractExpression = new SubtractExpression(addExpression, number3);// 解释和计算表达式Console.WriteLine($"结果: {subtractExpression.Interpret()}"); // 输出结果为 6}}
}

五、运行结果

运行上述代码后,输出结果为:

结果: 6

此结果表示表达式 “5 + 3 - 2” 被正确解析并计算。


六、优缺点分析
优点
  1. 灵活性:支持轻松扩展规则(添加新语法)。
  2. 可读性强:直观地表达复杂的语法规则。
  3. 封装性好:每个语法规则都有独立的实现。
缺点
  1. 性能问题:复杂的语法可能导致效率较低。
  2. 类的数量增多:每个语法规则需要一个类,导致类数量激增。

七、实际应用场景
  1. 编译器开发:如解析和执行简单的脚本语言。
  2. SQL 查询解析器:解析和构造 SQL 语句的执行逻辑。
  3. 规则引擎:如工作流引擎中解析和执行自定义规则。
  4. 自定义公式计算:如报表或财务软件中的公式引擎。

八、总结

解释器模式适合用于简单的语法解析和处理场景,能够灵活定义规则并动态解析。在 C# 中,我们可以利用解释器模式实现数学表达式求值、规则引擎解析等功能。
如果你的系统中需要处理简单的语法结构,不妨试试这个优雅的设计模式。


希望这篇文章能帮助你理解解释器模式!如果你有其他问题或建议,欢迎在评论区留言交流 😊!

相关文章:

C# 设计模式(行为型模式):解释器模式

C# 设计模式(行为型模式):解释器模式 (Interpreter Pattern) 什么是解释器模式? 解释器模式(Interpreter Pattern)是一种行为型设计模式,用于定义一种语言的语法表示,并提供一个解释…...

如何 cURL Elasticsearch:进入 Shell

作者:来自 Elastic Philipp Krenn Kibana 的控制台是开始使用 Elasticsearch 的 REST API 的最简单方法 - 语法突出显示、自动完成、格式化、导出 cURL、JavaScript 或 Python。而且你不必担心正确的端点、身份验证等。但是有时,如果 Kibana 不可用、你…...

深信服云桌面系统的终端安全准入设置

深信服的云桌面系统在默认状态下没有终端的安全准入设置,这也意味着同样的虚拟机,使用云桌面终端或者桌面套件都可以登录,但这也给系统带来了一些安全隐患,所以,一般情况下需要设置终端的安全准入策略,防止…...

Node.js 模块系统

Node.js 模块系统 1. 引言 Node.js,作为一个轻量级、高效的服务器端 JavaScript 运行环境,其模块系统是其最核心的特性之一。Node.js 的模块系统允许开发者将代码组织成多个文件,每个文件都是一个模块,这样可以提高代码的可维护性和可重用性。本文将详细介绍 Node.js 的模…...

数据结构知识收集尊享版(迅速了解回顾相关知识)

1、单链表、循环链表、双向链表,存储、逻辑结构 单链表、循环链表和双向链表都是线性表的链式存储结构,它们在存储和逻辑结构上有一些共同点和不同点。 存储结构 单链表:每个节点包含一个数据域和一个指针域,指针域指向下一个节…...

SpringMVC启动与请求处理流程解析

目录 SpringMVC的基本结构 1.MVC简介 2.基本结构 什么是Handler? 什么是HandlerMapping? 什么是HandlerAdapter? RequestMapping方法参数解析 DispatcherServlet的init()方法 DispatcherServlet的doService()方法 SpringBoot整合SpringMVC …...

C++ 日志库 spdlog 使用教程

Spdlog是一个快速、异步、线程安全的C日志库,他可以方便地记录应用程序的运行状态,并提供多种输出格式。官网:https://github.com/gabime/spdlog 安装教程可以参考:https://blog.csdn.net/Harrytsz/article/details/144887297 S…...

`http_port_t

http_port_t 是 SELinux(Security-Enhanced Linux)中的一种端口类型标签,用于标识哪些端口可以被 HTTP 和 HTTPS 服务使用。SELinux 是一种强制访问控制(MAC)安全模块,它通过定义安全策略来限制进程对系统资…...

SpringBoot中实现拦截器和过滤器

【SpringBoot中实现过滤器和拦截器】 1.过滤器和拦截器简述 过滤器Filter和拦截器Interceptor,在功能方面很类似,但在具体实现方面差距还是比较大的。 2.过滤器的配置 2.1 自定义过滤器,实现Filter接口(SpringBoot 3.0 开始,jak…...

不锈钢均温板结合强力粘合技术革新手机内部架构

摘要: 本文介绍了一种创新性的手机内部架构设计方案,其中不锈钢均温板不仅作为高效的散热元件,还充当了手机中框的主要结构件。通过使用强力不可拆胶水将主板、尾插和其他关键部件直接粘合到均温板上,该方案实现了更为紧密的热耦合…...

Docker安装使用

文章目录 Docker安装Docker的基础使用搜索&拉取镜像 Docker的生命周期利用Docker切换不同OSDocker容器 镜像的保存&分享Docker存储Docker网络 Docker安装 更新apt索引 sudo apt-get update添加Docker所需要的依赖 apt-get install ca-certificates curl gnupg lsb-r…...

React 如何进行路由变化监听

一、使用react-router库(以react-router-dom为例) 1. 历史(history)对象监听 1.1 原理 react-router内部使用history对象来管理路由历史记录。可以通过访问history对象来监听路由变化。在基于类的组件中,可以通过组…...

Unity UGUI使用技巧与经验总结(不定期更新)

Text自动缩放参考连接: Unity -UGUI中Text文本框的自动调整,字体大小的自适应调节_unity添加的字体大小锁定-CSDN博客 Toggle按钮选择时,显示对应的UI界面: 为Toggle组件的On Value Change事件添加对需要显示的对象的SetActive…...

中国乡镇界shp全境arcgis格式shp数据乡镇名称下载后内容测评

下载乡镇界shp链接:https://download.csdn.net/download/zhongguonanren99/19354855 标题中的“中国乡镇界shp全境arcgis格式shp数据乡镇名称2012年”揭示了这个数据集的核心内容。它是一个地理信息系统(GIS)数据,具体来说是使用…...

第 31 章 - 源码篇 - Elasticsearch 写入流程深入分析

写入源码分析 接收与处理 请求首先会被 Netty4HttpServerTransport 接收,接着交由 RestController 进行路由分发。 private void tryAllHandlers(final RestRequest request, final RestChannel channel, final ThreadContext threadContext) throws Exception {…...

node.js下载、安装、设置国内镜像源(永久)(Windows11)

目录 node-v20.18.0-x64 工具下载安装设置国内镜像源(永久) node-v20.18.0-x64 工具 系统:Windows 11 下载 官网https://nodejs.org/zh-cn/download/package-manager 版本我是跟着老师选的node-v20.18.0-x64如图选择 Windows、x64、v2…...

小于n的最大数 - 贪心算法 - C++

字节经典面试题 给定一个整数n,并从1~9中给定若干个可以使用的数字,根据上述两个条件,得到每一位都为给定可使用数字的、最大的小于整数n的数,例如,给定可以使用的数字为 {2,3,8} 三个数:给定 n3589&#x…...

【顶刊TPAMI 2025】多头编码(MHE)之极限分类 Part 3:算法实现

目录 1 三种多头编码(MHE)实现1.1 多头乘积(MHP)1.2 多头级联(MHC)1.3 多头采样(MHS)1.4 标签分解策略 论文:Multi-Head Encoding for Extreme Label Classification 作者…...

解决CentOS 8 YUM源更新后报错问题:无法下载AppStream仓库元数据

背景介绍 在尝试更新CentOS 8的YUM源以使用阿里云镜像时,遇到了Failed to download metadata for repo appstream的错误。此错误通常出现在执行yum clean all && yum makecache命令之后,表明系统无法从指定的URL获取AppStream仓库的元数据。本文…...

[python3]Excel解析库-openpyxl

https://openpyxl.readthedocs.io/en/stable/ openpyxl 是一个用于读写 Excel 2010 xlsx/xlsm/xltx/xltm 文件的 Python 库。它允许开发者创建、修改和保存电子表格,而无需依赖 Microsoft Excel 软件本身。openpyxl 支持读取和写入 Excel 的工作簿(Work…...

如何记录SQL谁修改了数据_通过触发器获取用户Session信息

数据库触发器无法直接获取真实业务用户,需应用层透传用户标识(如会话变量、自定义配置、CONTEXT_INFO等),数据库侧配合读取,所有方案均依赖应用主动设置,无自动识别能力。MySQL 触发器里拿不到 USER() 或 C…...

3分钟搞定城通网盘限速:免费直连解析工具完整指南

3分钟搞定城通网盘限速:免费直连解析工具完整指南 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 你是否曾经因为城通网盘的限速下载而烦恼?面对几十KB/s的下载速度,…...

C++ STL常用容器1——string容器

写在前面:⭐如果本篇博文对你有帮助,那就关注 点赞 收藏一下吧! 目录 1.string基本概念 2.string构造函数 3.string容器 4.string字符串拼接 5.string查找和替换 6.string字符串比较 7.string字符存取 8.string插入和删除 9.strin…...

beberlei/assert与Symfony/Zend验证器的深度对比:为什么选择轻量级方案

beberlei/assert与Symfony/Zend验证器的深度对比:为什么选择轻量级方案 【免费下载链接】assert Thin assertion library for use in libraries and business-model 项目地址: https://gitcode.com/gh_mirrors/ass/assert 在现代PHP开发中,数据验…...

Qwen3-ASR-1.7B作品集:WAV音频输入→结构化文本输出全流程效果呈现

Qwen3-ASR-1.7B作品集:WAV音频输入→结构化文本输出全流程效果呈现 1. 引言:当语音遇见文字,一个模型就够了 你有没有遇到过这样的场景? 开完一场两小时的会议,看着录音文件发愁,手动整理成文字稿要花半…...

手把手教你用Coze工作流给公众号文章做AI摘要:从抓取、总结到飞书推送的完整避坑指南

手把手教你用Coze工作流打造智能摘要系统:从公众号到飞书的自动化实践 每天打开微信,订阅号里堆积的未读文章数字像雪球一样越滚越大——这种信息焦虑已经成为现代人的通病。我们既不想错过行业动态,又苦于时间有限无法逐篇阅读。传统的人工筛…...

最新出炉!2026年金三银四Java初中高级面试1000问

跳槽结果有人欢喜有人愁,找到好的下家固然可喜,跳槽结果不理想的朋友也不必丧气,只要扎实提升自己的技术,弄明白大厂面试官的出题逻辑,进大厂必是水到渠成。 之前有位粉丝让我写一篇怎么进大厂的文章,这是…...

国家地理将广告牌改造成蜜蜂的活体家园

国家地理频道和 Meanwhile 在曼彻斯特推出了品牌蜂巢和“花板(bloomboards)”,以宣传即将上映的纪录片,同时为传粉者提供切实的帮助。在曼彻斯特安装的永久性“花板”标志着这部纪录片的上映,该片由探险家伯蒂格雷戈里…...

用8051单片机DIY呼吸灯:从硬件选型到代码调试全流程(附完整源码)

用8051单片机DIY呼吸灯:从硬件选型到代码调试全流程(附完整源码) 第一次接触嵌入式开发时,我被电子产品上那些会"呼吸"的指示灯深深吸引。这种灯光效果不仅美观,还能直观反映设备状态。作为初学者&#xff0…...

重载 AGV 控制怎么做?这篇 2025 论文把“载荷转移”讲透了

最新 AGV 控制论文解析:20 吨重载 AGV 怎么把“轨迹跟踪”和“车身稳定”一起管起来? 摘要 这次分析一篇 AGV 控制 方向的最新论文,而且和前面讲过的 Pure Pursuit 改进、外部视觉导航、托盘装卸 都不重复。本文选取的是 2025 年发表的论文 《…...