设计模式 解释器模式(Interpreter Pattern)
文章目录
- 解释器模式简绍
- 解释器模式的结构
- 优缺点
- UML图
- 具体代码实现
- Context 数据实体类,可以包含一些方法
- Abstract Expression 创建接口方法
- Terminal Expression 对数据简单处理
- Non-Terminal Expression 同样实现抽象接口方法
- Client(客户端) 调用方法
解释器模式简绍
解释器模式(Interpreter Pattern)是一种软件设计模式,属于行为型模式之一。这种模式的主要目的是定义语言的语法表示,并且提供了一个解释器来处理这种表示。解释器模式可以用于解析语言或表达式等场合,特别是在编译器、解释器和自然语言处理中应用较多。
解释器模式的结构
解释器模式包含以下几个主要角色:
- Abstract Expression(抽象表达式):
- 这是所有表达式的公共接口或抽象类,它定义了所有非终端表达式和终端表达式所需要的方法,通常是interpret()方法。
- Terminal Expression(终端表达式):
- 实现了抽象表达式接口,负责处理文法中的文字符号,例如单词或数字等。
- Non-Terminal Expression(非终端表达式):
- 同样实现了抽象表达式接口,但它除了包含对文法符号的处理外,还包含对多个表达式的组合处理逻辑。
- Context(环境):
- 包含解释器之外的一些全局数据或者局部数据,供解释器解释过程中使用。
- Client(客户端):
- 构造一个完整的文法树,然后给定一个具体的上下文环境,最后调用解释方法。
优缺点
- 解释器模式的优点
- 增加了新的语句只需要增加新的终结符和非终结符表达式,不需要修改现有类。
- 解释器模式的缺点
- 对于复杂文法而言,类的数量会激增,导致系统难以维护。
- 解释器模式递归使用,对于递归深度大的情况效率较低。
UML图
具体代码实现
Context 数据实体类,可以包含一些方法
package InterpreterPatternModel;public class TestContext {private Integer a1;private Integer a2;private String a3;public TestContext(Integer a1, Integer a2, String a3){this.a1 = a1;this.a2 = a2;this.a3 = a3;}public String getA3() {return a3;}public void setA3(String a3) {this.a3 = a3;}public Integer getA1() {return a1;}public void setA1(Integer a1) {this.a1 = a1;}public Integer getA2() {return a2;}public void setA2(Integer a2) {this.a2 = a2;}
}
Abstract Expression 创建接口方法
public interface AbstractExpression {Integer interpret(TestContext context);}
Terminal Expression 对数据简单处理
Terminal Expression 是解释器模式中的一种表达式类型,它表示文法中的最基本元素,这些元素不能再进一步分解。终端表达式通常对应于文法中的终端符号,如关键字、标识符、常量等。
- 简单性:终端表达式是最基本的表达式,它不包含其他表达式。
- 不可分解性:终端表达式代表的是文法中最基本的符号,不能再进一步拆解。
- 具体实现:终端表达式通常是一个具体的类,它实现了抽象表达式接口,并提供了解释自身的方法。
使用 switch 实现 加减乘除,对数据做直接处理
package InterpreterPatternModel;public class TestTerminalExpression implements AbstractExpression {@Overridepublic Integer interpret(TestContext context) {switch (context.getA3()){case "+":return context.getA1() + context.getA2();case "-":return context.getA1() - context.getA2();case "*":return context.getA1() * context.getA2();case "/":return context.getA1() / context.getA2();default:return null;}}}
Non-Terminal Expression 同样实现抽象接口方法
Non-Terminal Expression 也是一种表达式类型,它代表了文法中的复合元素。这些元素由一个或多个终端表达式和其他非终端表达式组成。非终端表达式定义了如何组合这些表达式来解释更复杂的句子。
- 组合性:非终端表达式可以包含一个或多个终端表达式或其他非终端表达式。
- 递归性:非终端表达式通常通过递归调用其他表达式的 interpret 方法来解释更复杂的表达式。
- 具体实现:非终端表达式也是一个具体的类,它实现了抽象表达式接口,并提供了解释自身的方法。
对数据做复杂处理以及调用上面的优化,实现再次封装
package InterpreterPatternModel;public class TestNonTerminalExpression implements AbstractExpression {private TestContext context;public TestNonTerminalExpression(Integer a1, Integer a2, String a3){this.context = new TestContext(a1, a2, a3);}public Integer exec(){return this.interpret(context);}@Overridepublic Integer interpret(TestContext context) {TestTerminalExpression testTerminalExpression = new TestTerminalExpression();return testTerminalExpression.interpret(context);}
}
Client(客户端) 调用方法
package InterpreterPatternModel;public class TestClient {public static void exec(){TestTerminalExpression testTerminalExpression = new TestTerminalExpression();Integer interpret = testTerminalExpression.interpret(new TestContext(1, 2, "*"));System.out.println(interpret);TestNonTerminalExpression nonTerminal = new TestNonTerminalExpression(10, 2, "+");Integer exec = nonTerminal.exec();System.out.println(exec);Integer interpret1 = nonTerminal.interpret(new TestContext(new TestNonTerminalExpression(1, 2, "*").exec(), new TestNonTerminalExpression(10, 2, "-").exec(), "+"));System.out.println(interpret1);}
}
通过Terminal Expression(终端表达式) 和 Non-Terminal Expression(非终端表达式)
这两种表达式类型的组合,解释器模式能够构建出一个能够解析并解释复杂文法的解释器。这种模式使得添加新的语法规则变得相对容易,因为只需添加新的终端和非终端表达式即可。但是,随着文法复杂度的增加,非终端表达式的数量也会增加,这可能导致类的数量激增,从而增加了系统的复杂性和维护难度。
相关文章:

设计模式 解释器模式(Interpreter Pattern)
文章目录 解释器模式简绍解释器模式的结构优缺点UML图具体代码实现Context 数据实体类,可以包含一些方法Abstract Expression 创建接口方法Terminal Expression 对数据简单处理Non-Terminal Expression 同样实现抽象接口方法Client(客户端) 调…...
Linux echo命令讲解及与重定向符搭配使用方法,tail命令及日志监听方式详解
echo echo具有回声,回响的意思,在linux系统中echo一般可以输出指定字符或用于命令执行 echo命令的用法为 echo 输出字符串 或 echo 命令 若参数为字符串则进行字符串输出,注意若字符串中含空格最好将其用引号括起,防止echo命…...

Linux网络:总结协议拓展
1. TCP/IP四层模型总结 2. 网络协议拓展 DNS协议(地址解析协议) TCP/IP使用IP地址和端口号来确定网络中一台主机的一个程序。 但是这样标定不方便记忆,于是开始引出主机名(字符串),使用hosts文件来描述…...

去除恢复出厂设置中UI文字显示
文章目录 需求场景 一、代码跟踪与分析在线文字搜索RK平台本地源码搜索实际测试验证代码推理 二、实现方案三、延伸知识四、知识总结 需求 需求:去除恢复出厂设置中UI文字显示 场景 Android 相关产品各种方向旋转、强制横竖屏等需求,导致在恢复出厂设…...
《高校教育管理》
《高校教育管理》为中文社会科学引文索引(CSSCI)来源期刊、北大中文核心期刊、RCCSE中国核心学术期刊、人大“复印报刊资料”重要转载来源期刊,是江苏大学主办,中国高等教育管理研究会协办的全国性高等教育管理专业期刊。 ISSN 1…...
全国计算机二级考试C语言篇4——选择题
运算符与表达式 1.赋值的正确写法 赋值操作是一个很常见的操作,但是赋值操作也有一些需要注意的地方。赋值操作是将一个表达式的值赋给一个变量的过程。在C语言中,赋值操作符是""。结合性从右到左,不控制求值顺序。 下面是几种C语言…...
数据结构————哈希表
哈希表(Hash table),也被称为散列表,是一种根据关键值(Key value)而直接进行访问的数据结构。它通过把关键值映射到表中的一个位置来访问记录,从而加快查找的速度。这个映射函数被称为散列函数或…...

element select + tree
element select tree的使用 <template slot"action1" slot-scope"text, record, index"><el-select v-model"record.tagValue" multiple placeholder"请选择":filter-method"(e) > filterTree(e, index)" filt…...
LeetCode之矩阵
36. 有效的数独 class Solution {// 方法 isValidSudoku 接收一个字符二维数组 board,表示数独棋盘,返回是否有效public boolean isValidSudoku(char[][] board) {// 创建三个二维数组来记录每一行、列和子框中数字的出现次数int[][] rows new int[9][…...
Windows文件系统介绍与基本概念解析
1. 引言 1.1 什么是文件系统 文件系统是一种管理和组织计算机存储设备上文件和文件夹的方法。它提供了文件的创建、读取、写入、删除等操作,并负责文件在存储设备上的存储和访问。 在操作系统中,文件系统是一个重要的组成部分,它使得用户可以方便地使用计算机存储设备来存…...
使用 Apache POI 实现 Java Word 模板占位符替换功能
使用 Apache POI 实现 Java Word 模板占位符替换功能 在日常开发中,我们经常会遇到生成 Word 文档的需求,特别是在需要从模板导出 Word 文件时,比如生成合同、报告等。通过使用模板,开发者可以减少重复的工作,将预定义…...

第三届人工智能与智能信息处理国际学术会议(AIIIP 2024)
目录 大会介绍 基本信息 合作单位 主讲嘉宾 会议组委 征文主题 参会方式 会议日程 中国-天津 | 2024年10月25-27日 | 会议官网:www.iiip.net 大会介绍 第三届人工智能与智能信息处理国际学术会议(AIIIP 2024)将于202…...

【动手学深度学习】04 数据操作 + 数据预处理(个人向笔记)
数据操作 N维数组是机器学习和神经网络的主要数据结构其中 2-d 矩阵中每一行表示每一行表示一个样本 当维度来到三维的时候则可以表示成一张图片,再加一维就可以变成多张图片,再加一维则可以变成一个视频 访问元素 冒号表示从冒号左边的元素到冒号右…...
本地搭建 Whisper 语音识别模型
Whisper 是由 OpenAI 开发的一款强大的语音识别模型,具有出色的多语言处理能力。搭建和使用 Whisper 模型可以帮助您将音频内容转换为文本,这在语音转写、语音助手、字幕生成等应用中都具有广泛的用途。本指南将对如何在本地环境中搭建 Whisper 语音识别…...

数据集成-缝合一套数据仓库Infra的臆想
一、数据集成当前困境 目前数据集成基础设施建设仅一个单一数据库,无法很好支持上层应用的建设步骤,继续采用当前设施跟随产品的策略,数据产品开发受限巨大,从目前实施的几个产品看,存在以下主要问题: 功能…...
运营有哪几种?
运营又有很多类,分为:内容运营、用户运营、活动运营、产品运营、新媒体运营、社群运营、电商运营、短视频运营 1.内容运营: 做内容提升各类数据,比如内容的数量/浏览数量/互动数传播数等。 适合人群:适合喜欢看文章热…...

Android视频编辑:利用FFmpeg实现高级功能
在移动设备上进行视频编辑的需求日益增长,用户期望能够在智能手机或平板电脑上轻松地编辑视频,以满足社交媒体分享或个人存档的需求。Android平台因其广泛的用户基础和开放的生态系统,成为视频编辑应用的理想选择。FFmpeg,作为一个…...

图片无损缩放PhotoZoom Pro 9.0.2绿色版 +免费赠送PhotoZoom激活优惠代码
PhotoZoom Pro 9.0.2 是一款专业的图片无损缩放软件,该软件采用了 benvista s-spline 独特技术,增强了对图像格式的支持,多处理器支持,GPU 加速,win10和 Photoshop CC 支持。带来一流的数字图形扩展与缩减技术。该软件…...
tekton pipelineresources
PipelineResource 代表着一系列的资源,主要承担作为 Task 的输入或者输出的作用。它有以下几种类型: git:代表一个 git 仓库,包含了需要被构建的源代码。将 git 资源作为 Task 的 Input,会自动 clone 此 git 仓库。pu…...

OFDM系统PAPR算法的MATLAB仿真,对比SLM,PTS以及CAF,对比不同傅里叶变换长度
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、选择映射(SLM) 4.2 相位截断星座图(PTS) 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 mat…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...