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

解释器模式(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, !, !, !]

相关文章:

  • 【Spring Boot 3】【JSON】读取JSON文件
  • 在springboot中Redis数据与MySQL数据的一致性方案思考和案例
  • 2024.3.13 C++
  • PHP爬虫技术:利用simple_html_dom库分析汽车之家电动车参数
  • 2.案例、鼠标时间类型、事件对象参数
  • kubernetes学习总结
  • Java特性之设计模式【组合模式】
  • 基于C++的一种字符串切分方法及示例代码
  • 升级版本彻底解决bootstrap-table-fixed-columns固定列后行对不齐问题
  • 滴滴 Flink 指标系统的架构设计与实践
  • 每天学习一个Linux命令之cat
  • rust开发100问?
  • antd5 虚拟列表原理(rc-virtual-list)
  • [剪藏] - 由哇哈哈和农夫山泉所想到的
  • OpenCV 图像重映射函数remap()实例详解
  • $translatePartialLoader加载失败及解决方式
  • 【附node操作实例】redis简明入门系列—字符串类型
  • LeetCode29.两数相除 JavaScript
  • nodejs:开发并发布一个nodejs包
  • PAT A1092
  • SpiderData 2019年2月25日 DApp数据排行榜
  • Spring核心 Bean的高级装配
  • Swoft 源码剖析 - 代码自动更新机制
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 翻译--Thinking in React
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 离散点最小(凸)包围边界查找
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 使用API自动生成工具优化前端工作流
  • 小程序开发之路(一)
  • 容器镜像
  • (1)Nginx简介和安装教程
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (3)nginx 配置(nginx.conf)
  • (ZT)薛涌:谈贫说富
  • (二十三)Flask之高频面试点
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)计算机毕业设计大学生兼职系统
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (十六)一篇文章学会Java的常用API
  • (转)Linux下编译安装log4cxx
  • (转载)虚函数剖析
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET MVC第三章、三种传值方式
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET Reactor简单使用教程
  • .net Signalr 使用笔记
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .net的socket示例
  • .net下的富文本编辑器FCKeditor的配置方法
  • /etc/skel 目录作用
  • :中兴通讯为何成功
  • [ CTF ] WriteUp-2022年春秋杯网络安全联赛-冬季赛
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?