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

技术成神之路:设计模式(二十三)解释器模式

在这里插入图片描述
相关文章:技术成神之路:二十三种设计模式(导航页)

介绍

解释器模式(Interpreter Pattern)是一种行为设计模式,用于定义一种语言的文法表示,并提供一个解释器来处理这种文法。它用于处理具有特定语法或表达式的场景。

1. 定义


解释器模式定义了一种语言的文法表示,并定义一个解释器用来解释语言中的句子。

2. 主要作用


  • 提供一种方式来评估语言的文法或表达式:解释器模式允许系统解析和执行由文法定义的语言。
  • 简化对复杂表达式的处理:通过将复杂的表达式分解为简单的表达式,可以降低处理的复杂性。
  • 易于扩展:新的语法可以通过添加新的终结符或非终结符类轻松扩展。

3. 解决的问题


  • 处理和解析特定语言或表达式的需求。
  • 提供一种清晰的方式来定义文法及其解释。
  • 使得对文法和表达式的扩展变得简单明了。

4. 模式原理


包含角色:

  1. 抽象表达式(Expression): 一个接口或抽象类,定义了解释方法(interpret())。所有具体表达式都要实现这个接口。
  2. 终结符表达式(TerminalExpression): 具体的表达式类,代表语法中的终结符。在解释器中,这些类通常与输入的基本元素对应,如某个具体的字符或词汇。
  3. 非终结符表达式(NonterminalExpression): 这也是一个具体的表达式类,用于解释由多个表达式组成的复杂表达式。它通常用于构造更复杂的语法结构,并实现解释方法。
  4. 上下文(Context): 上下文对象用于存储解释器的状态信息,包括输入字符串和其他相关数据。它在解析过程中提供必要的上下文信息给各个表达式。

UML类图:
在这里插入图片描述
示例代码:

// 抽象表达式
interface Expression {int interpret();
}// 终结符表达式:数字
class Number implements Expression {private int number;public Number(int number) {this.number = number;}@Overridepublic int interpret() {return number;}
}// 非终结符表达式:加法
class Add implements Expression {private Expression leftExpression;private Expression rightExpression;public Add(Expression left, Expression right) {this.leftExpression = left;this.rightExpression = right;}@Overridepublic int interpret() {return leftExpression.interpret() + rightExpression.interpret();}
}// 非终结符表达式:减法
class Subtract implements Expression {private Expression leftExpression;private Expression rightExpression;public Subtract(Expression left, Expression right) {this.leftExpression = left;this.rightExpression = right;}@Overridepublic int interpret() {return leftExpression.interpret() - rightExpression.interpret();}
}

调用:

public class InterpreterDemo {public static void main(String[] args) {// 表达式:3 + 5Expression three = new Number(3);Expression five = new Number(5);Expression add = new Add(three, five);System.out.println("Result: " + add.interpret());  // 输出: Result: 8// 表达式:10 - 2Expression ten = new Number(10);Expression two = new Number(2);Expression subtract = new Subtract(ten, two);System.out.println("Result: " + subtract.interpret());  // 输出: Result: 8}
}

emm…这个模式才是冷门中的冷门,由于只能在特定领域使用,让我们动手写的情况很少,一般只是在源码中会见到,下面就举几个源码中的例子吧,加深下印象:

1. Java 正则表达式
正则大家都用过吧,可以把一些特定的字符 通过正则转化为我们预期的效果,在正则表达式中 Pattern类负责解析正则表达式的语法,而Matcher类则用于执行该模式的匹配。

2. Android 自定义 View 的属性解析
自定义视图会解析 XML 中定义的属性,在自定义视图的构造函数中,通过AttributeSet来解析XML中定义的属性,类似于解释器的功能。

3. DSL (领域特定语言) 解析
DSL 正如其名,在特定领域下的语言,这个语言可以由你自己定制,常见的在Kotlin中 有很多语法糖 都运用了DSL,在一些指定场景下很实用,在Android开发中,Gradle构建脚本使用一种基于Groovy的DSL来定义构建配置,Gradle解析器使用了解释器模式。

这个模式,不要求一定要掌握,但要见到认识,给面试官能吹nb就行了😎。

5. 优缺点


优点:

  • 易于改变和扩展文法。
  • 容易实现简单的语言解释器。

缺点:

  • 对复杂的文法不太适用,类数目会增加。
  • 解释器模式会引起性能问题。

6. 应用场景


  • 解析特定的语言或格式(例如:数学表达式、SQL查询、正则表达式)。
  • 定义简单的文法规则并提供语法分析功能。
  • 在领域特定语言(DSL)中,提供一种简单的语法解析方式。

7. 总结


解释器模式适用于简单的语法解析和解释场景,但不适合复杂的语法结构。它通过类和对象的组合,灵活定义和扩展语法结构。

至此,23种设计模式告一段落

相关文章:

技术成神之路:设计模式(二十三)解释器模式

相关文章:技术成神之路:二十三种设计模式(导航页) 介绍 解释器模式(Interpreter Pattern)是一种行为设计模式,用于定义一种语言的文法表示,并提供一个解释器来处理这种文法。它用于处理具有特定语法或表达…...

2024软考《软件设计师》-Python专题知识(含历年真题解析)

自2020年之后,软考软件设计师考试在综合知识部分开始增加Python编程语言相关考点,每年会考2~3分的样子。本文将结合近几年常考的内容,扩展一下Pyhton的基础知识!考前看一看,或许有所帮助。 一、基础语法 标识符 第一…...

基于大数据 Python+Vue 旅游推荐可视化系统(源码+LW+部署讲解+数据库+ppt)

!!!!!!!!! 会持续一直更新下去 有问必答 一键收藏关注不迷路 源码获取:https://pan.baidu.com/s/1aRpOv3f2sdtVYOogQjb8jg?pwdjf1d 提取码: jf1d &#…...

使用虚拟机搭建环境:CentOS7 Docker、MySQL、Redis 安装与配置

创作灵感 项目实践总结:记录了在虚拟机中安装与配置CentOS7环境下的Docker、MySQL、Redis的全过程,帮助理解和应用各项技术。技术笔记与问题总结:详细梳理了每一步安装的关键点与常见问题,并给出了解决方案。职业感悟与心得&…...

[分享] Docker容器可视化管理工具 - WGCLOUD

WGCLOUD是新一代运维监测平台,它可以监控Docker容器的各种性能数据,比如内存,cpu,Image,运行时间,运行状态,端口映射等信息 WGCLOUD也支持在页面启动,重启,停止Docker容…...

保存网页中 canvas 的内容

在开发人员工具中,保存网页中 canvas 的内容,可以用这个方法: 1. 在 dom 中创建一个下载按钮 <button id="save">保存</button>2. 控制台中运行: const gCanvas = document.querySelector(#page_1);function onSave() {gCanvas.toBlob((blob) =&g…...

PID控制原理

PID控制原理 PID控制器是一种经典且广泛应用于工业控制领域的反馈控制器&#xff0c;它由比例&#xff08;P&#xff09;、积分&#xff08;I&#xff09;和微分&#xff08;D&#xff09;三个部分组成。通过对这三个部分的综合调节&#xff0c;PID控制器能够实现对被控对象的…...

python 使用 企微机器人发送消息

import requestswecom_bot_webhook ""msg_text "" # 要发送的消息内容""" mentioned_mobile_list : 手机号列表 , 提醒手机号对应的群成员(某个成员) """ res requests.post(wecom_bot_webhook,json{"msgtype"…...

ARM/Linux嵌入式面经(五二):华为

文章目录 一面技术面相关问题1. **硬件改进的具体内容是什么?**硬件改进的具体内容深入询问及回答2. **在维护前任师兄的代码时,你遇到了哪些挑战?**问题回答面试官追问及回答3. **在嵌入式系统中,内存泄漏通常有哪些原因?**一、内存泄漏的主要原因二、内存泄漏的具体场景…...

[旧日谈]高清画面撕裂问题考

背景 无边框透明背景透明的窗口&#xff0c;在随着缩放比例非整数倍数放大时的画面发生了露底、撕裂问题。 当我们在使用Qt开发的时候&#xff0c;遇到了一个结构性问题。因为我们的软件是自己做的&#xff0c;所以要自己定义标题栏&#xff0c;所以我们设置了软件为FrameLess…...

Nginx反向代理-域名代理前后端项目部署流程

一、下载Nginx 地址&#xff1a;https://nginx.org/en/download.html 1、稳定版本下载 二、Nginx配置 1、下载文件完成后&#xff0c;解压文件 2、打开文件目录下conf目录&#xff0c;打开找到nginx.conf 3、文件配置 注意&#xff1a;.conf 文件使用文本编辑器编辑后&…...

代码随想录(十二)——图论

并查集 并查集主要有三个功能。 寻找根节点&#xff0c;函数&#xff1a;find(int u)&#xff0c;也就是判断这个节点的祖先节点是哪个将两个节点接入到同一个集合&#xff0c;函数&#xff1a;join(int u, int v)&#xff0c;将两个节点连在同一个根节点上判断两个节点是否在…...

如何通过 Service Mesh 构建高效、安全的微服务系统

1. 引言 1.1.什么是 Service Mesh&#xff1f; Service Mesh 是一种基础架构层&#xff0c;负责处理微服务之间的通信&#xff0c;它通过在每个服务旁边部署代理&#xff08;通常称为 Sidecar&#xff09;来捕获和管理服务间的网络流量。这种方式解耦了微服务的业务逻辑和基础…...

MySQL 临时表详解

在 MySQL 中&#xff0c;临时表&#xff08;Temporary Table&#xff09;是一种非常有用的工具&#xff0c;可以帮助我们在执行复杂查询时存储临时数据。临时表的存在时间仅限于会话期&#xff0c;当会话结束后&#xff0c;临时表自动销毁。本文将详细讲解 MySQL 临时表的创建、…...

Kafka系列之:Kafka集群新增节点后实现数据均衡

Kafka系列之:Kafka集群新增节点后实现数据均衡 一、背景二、Kafka集群快速负载均衡方案三、按照Topic负载均衡Kafka系列之:使用Kafka Manager实现leader分区平衡和broker节点上分区平衡一、背景 Kafka集群新增节点,要使得每个节点数据均衡,在增加完kafka topic分区后,要进…...

实验:使用Oxygen发布大型手册到Word格式

此前&#xff0c;我曾发表过一篇文章《结构化文档发布的故事和性能调优》&#xff0c;文中讨论了在将大型DITA手册转换为PDF格式时可能遇到的性能挑战及相应的优化策略。 近日&#xff0c;有朋友咨询&#xff0c;若将同样的大型手册输出为MS Word格式&#xff0c;是否也会面临…...

一个基于.NET8+WPF开源的简单的工作流系统

项目介绍 AIStudio.Wpf.AClient 是一个基于 WPF (Windows Presentation Foundation) 构建的客户端框架&#xff0c;专为开发企业级应用而设计。该项目目前版本为 6.0&#xff0c;进行了全面优化和升级&#xff0c;提供了丰富的功能和模块&#xff0c;以满足不同场景下的开发需…...

MFC工控项目实例二十七添加产品参数

承接专栏《MFC工控项目实例二十六创建数据库》 在型号参数界面添加三个参数试验时间、最小值、最大值。变量为double m_edit_time; double m_edit_min; double m_edit_max; 1、在SEAL_PRESSURE.h中添加代码 class CProductPara { public:union{struct{...double m_edit_min;…...

PgSQL常用SQL语句

PgSQL常用SQL语句 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 PgSQL是一种开源的关系型数据库管理系统&#xff0c;它是PostgreSQL的一种实现。本文将介绍一些常用的PgSQL SQL语句&a…...

python多线程处理xlsx,多进程访问接口

import pandas as pd from concurrent.futures import ThreadPoolExecutor# 读取Excel文件 file_path scence.xlsx df pd.read_excel(file_path)# 定义每10行处理逻辑 def process_rows(start_idx):end_idx min(start_idx 10, len(df)) # 处理每10行for i in range(start_…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...

华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)

题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...