解释器模式(Interpreter Pattern)

解释器模式

说明

解释器模式(Interpreter Pattern)属于行为型模式,是指给定一门语言,定义它的语法(文法)的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。是一种按照规定的语法(文法)对语言进行解析的模式。
我们平时开发用的编译器,就是一种解释器的实现,通过规定好的编程语法,通过解析后转换成机器码,才能让计算机执行。某些领域也有其规范的语法,比如乐谱、莫斯码等等。解释器模式在开发中几乎不会用到,除非需要创建一门新的语言。

结构

解释器模式主要角色如下:
抽象表达式(Expression):定义解释语法的接口;
终结符表达式(TerminalExpression):实现Expression定义的解释方法。终结符表达式可以理解为语法中需要被操作的对象,比如1 + 2,1跟2都是终结符表达式;
非终结符表达式(NonterminalExpression):实现Expression定义的解释方法。非终结符表达式可以理解为语法中的运算符或者关键字,根据需求有不同的实现;
上下文环境类(Context):包含解释器之外的信息与逻辑,负责根据语法调用不同的解释器等功能。
解释器模式-类结构图

代码案例

抽象表达式(Expression)

/*** @program: interpreter* @description: 抽象表达式接口* @author: wxw* @create: 2024-03-13 18:33**/
public interface IExpression {String interpret();
}

非终结符表达式(NonterminalExpression)

/*** @program: interpreter* @description: 处理字符串表达式*              非终结符表达式(NonterminalExpression)* @author: wxw* @create: 2024-03-13 18:36**/
public abstract class ProcessingExpression implements IExpression {protected IExpression str;public ProcessingExpression(IExpression str) {this.str = str;}
}/*** @program: interpreter* @description: 转换大写-处理字符串表达式*              非终结符表达式(NonterminalExpression)* @author: wxw* @create: 2024-03-13 18:44**/
public class UppercaseExpression extends ProcessingExpression {public UppercaseExpression(IExpression str) {super(str);}@Overridepublic String interpret() {return str.interpret().toUpperCase();}
}/*** @program: interpreter* @description: 转换小写-处理字符串表达式*              非终结符表达式(NonterminalExpression)* @author: wxw* @create: 2024-03-13 18:44**/
public class LowercaseExpression extends ProcessingExpression {public LowercaseExpression(IExpression str) {super(str);}@Overridepublic String interpret() {return str.interpret().toLowerCase();}
}/*** @program: interpreter* @description: 转换成char数组-处理字符串表达式*              非终结符表达式(NonterminalExpression)* @author: wxw* @create: 2024-03-13 18:44**/
public class CharsExpression extends ProcessingExpression {public CharsExpression(IExpression str) {super(str);}@Overridepublic String interpret() {return Arrays.toString(str.interpret().toCharArray());}
}

终结符表达式(TerminalExpression)

/*** @program: interpreter* @description: 字符串终结表达式*              终结符表达式(TerminalExpression)* @author: wxw* @create: 2024-03-13 18:35**/
public class StringExpression implements IExpression {private String str;public StringExpression(String str) {this.str = str;}@Overridepublic String interpret() {return this.str;}
}

上下文环境类

/*** @program: interpreter* @description: 上下文环境类* @author: wxw* @create: 2024-03-13 18:38**/
public class StringContext {private String str;public StringContext(String str) {this.str = str;}public String handleStr(){String[] strs = str.split(" ");String key = strs[0];IExpression str = new StringExpression(strs[1]);switch (key){case "uppercase":return new UppercaseExpression(str).interpret();case "lowercase":return new LowercaseExpression(str).interpret();case "chars":return new CharsExpression(str).interpret();default:return "输入错误!!!";}}
}

客户端

public class Test {public static void main(String[] args) {String str1 = "uppercase hello!!!";String str2 = "lowercase Hello!!!";String str3 = "chars hello!!!";StringContext stringContext1 = new StringContext(str1);System.out.println(stringContext1.handleStr());StringContext stringContext2 = new StringContext(str2);System.out.println(stringContext2.handleStr());StringContext stringContext3 = new StringContext(str3);System.out.println(stringContext3.handleStr());}
}

输出结果

HELLO!!!
hello!!!
[h, e, l, l, o, !, !, !]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/746463.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[NSSRound#18 Basic]web解析

文章目录 门酱想玩什么呢?Becomeroot 门酱想玩什么呢? 打开题目,加载完视频后要求我们给个游戏链接 点开评论区不难发现应该是想玩元梦之星,这里有个评论功能可以上传图片 我们随便输入点东西发现是插入并赋值到content元素里面 …

提示找不到MSVCP140.dll无法继续执行此代码的多种解决方法

当计算机系统在运行过程中突然提示“丢失MSVCP140.dll”这一错误信息时,意味着系统无法找到并加载这个至关重要的动态链接库文件。MSVCP140.dll是Microsoft Visual C Redistributable Package的一部分,对于许多基于Windows的应用程序来说,尤其…

Exam in MAC [容斥]

题意 思路 正难则反 反过来需要考虑的是: (1) 所有满条件一的(x,y)有多少对: x 0 时,有c1对 x 1 时,有c对 ...... x c 时,有1对 以此类推 一共有 (c2)(c1)/2 对 (2) 符合 x y ∈ S的有多少对&#xff1a…

openssl3.2 - note - Getting Started with OpenSSL

文章目录 openssl3.2 - note - Getting Started with OpenSSL概述笔记openssl 历史版本Configure 选项开关支持的OSopenssl 文档简介安装新闻每个平台的安装文档支持的命令列表配置文件格式环境变量 END openssl3.2 - note - Getting Started with OpenSSL 概述 看到官方文档…

物联网技术助力智慧城市转型升级:智能、高效、可持续

目录 一、物联网技术概述及其在智慧城市中的应用 二、物联网技术助力智慧城市转型升级的路径 1、提升城市基础设施智能化水平 2、推动公共服务智能化升级 3、促进城市治理现代化 三、物联网技术助力智慧城市转型升级的成效与展望 1、成效显著 2、展望未来 四、物联网技…

Java中文乱码问题解析与解决方案

在日常工作中,我们经常会遇到中文乱码的问题。乱码问题不仅影响用户体验,还可能导致数据丢失或解析错误。因此,了解和掌握中文乱码问题的原因和解决方案,对于Java开发者来说至关重要。本文将分析常见的Java中文乱码场景&#xff0…

Python chardet.detect 字符编码检测

chardet.detect 是 Python 的一个库,用于检测给定字节串的字符编码。其检测原理基于统计学方法。 具体来说,chardet.detect 使用了一种叫做统计字符 n-gram(通常为 n1 或 n2)的方法。它会统计字节串中每个字符或字符对出现的频率…

【C++初阶】C++入门(上)

C的认识 ①什么是C? ​ C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。 ​ 于是1982年,Bjarne Stroustrup(本…

D-阿洛酮糖-DAEase酶固定化载体及混合糖液分离

#D-阿洛酮糖-DAEase酶固定化载体及混合糖液分离 ​阿洛酮糖为白色固体晶体,无气味,具有较大的溶解度,柔和的口感,其具有传统甜味剂蔗糖70%的甜度,却几乎不提供任何热量。其与食物中的蛋白质,如鸡蛋蛋白发生…

ntp 部署

文章目录 简介ntp和ntpdate区别环境准备启动 简介 ntp全名 network time protocol 。NTP服务器可以为其他主机提供时间校对服务 ntp和ntpdate区别 两个服务都是centos自带的(centos7中不自带ntp)。ntp的安装包名是ntp;ntpdate的安装包是ntp…

【leetcode+深度/广度优先搜索】841. 钥匙和房间 (DFS,BFS)

leetcode-cn:leetcode面试75道精华:https://leetcode.cn/studyplan/leetcode-75/ 841.钥匙和房间:https://leetcode.cn/problems/keys-and-rooms/description/ 一、题目:841. 钥匙和房间 有 n 个房间,房间按从 0 到 n…

一对多文件传输该如何优化?

在数字化转型的浪潮中,企业对高效、安全的一对多文件传输需求日益增长。传统的文件传输方式,如纸质文件、电子邮件和FTP等,虽然在某些场景下仍然发挥作用,但在处理大规模、高频率的数据传输时,它们的局限性逐渐显现。本…

C#学习汇总

C#学习汇总 1.C#编程基础 C#语法C#使用变量 2.控制程序流程和转换类型 C#控制台应用程序C#选择语句和迭代语句C#类型转换 3.编写函数 C#编写函数 4.使用面向对象 C#构建类库C#在字段中存储数据C#写入和调用方法C#使用属性和索引器控制访问 5.实现接口和继承类 C#接口…

详细介绍Seq2Seq、Attention、Transformer !!

文章目录 前言 1、Seq2Seq工作原理 核心思想 工作原理 Encoder(编码器) Dncoder(解码器) 2、Attention工作原理 核心逻辑:从关注全部到关注重点 工作原理 Encoder(编码器) Decoder(解…

Pytorch:多模态大模型预训练、大模型微调:加载数据的正确姿势

对于近期兴起的多模态大模型的预训练和微调,常见情况是训练数据规模极大,通常可以达到1m-100m级别。此时,训练数据通常用一个上百万行的jsonl文件存储,每行对应一条json格式的训练数据,其中可能包括数据关联的其他图、…

Simple and Scalable Strategies to Continually Pre-train Large Language Models

Simple and Scalable Strategies to Continually Pre-train Large Language Models 相关链接:arxiv 关键字:Large Language Models、Pre-training、Continual Learning、Distribution Shift、Adaptation 摘要 大型语言模型(LLMs)通常会在数十亿个tokens…

vue实现微信自带浏览器分享(小卡片形式)

注意&#xff1a;只能在微信自带浏览器打开进行分享 1.图片效果 2.cdn引入weixin-js-sdk的依赖 在index.html中引入 <script src"https://res2.wx.qq.com/open/js/jweixin-1.6.0.js"></script>2.在assets/js文件夹中创建share.js文件 import axios fr…

KeyError,Python使用DDT,抛KeyError异常

目录 Python使用DDT&#xff0c;抛KeyError异常 报错&#xff1a; line 158, in testFace print("kwargs[logName]&#xff1a;",kwargs["logName"]) KeyError: logName运行demo test_Data [{"logName": "shutDownTakePictureFaceLog&q…

c 语言stdlib.h介绍

stdlib.h介绍 stdlib.h 是 C 语言的标准库头文件&#xff0c;它包含了许多与内存分配、随机数生成、字符串转换和其他常用函数相关的函数原型和宏定义。 内存管理函数 malloc()&#xff1a;用于分配指定字节数的内存空间。 void* malloc(size_t size);其中&#xff0c;size…

transform inverse()函数解析

transform inverse() const { const Quaternion rotation rotation_.conjugate(); const Vector translation -(rotation * translation_); return transform(translation, rotation); } 这段代码定义了一个inverse()成员函数&#xff0c;用于计算一个变换&#xff08;t…