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

devtools/2024/10/25 7:01:11/

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

介绍

解释器模式(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种设计模式告一段落


http://www.ppmy.cn/devtools/128619.html

相关文章

Django+Vue智慧分析居家养老系统统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 需要的环境3.2 Django接口层3.3 实体类3.4 config.ini3.5 启动类3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质创作者&…

算法通关(2)--单调队列

特点: 队列中的元素保持单调递增或者单调递减的顺序可以在头部和尾部进行元素的插入和删除操作大小是动态变化的,由元素的入队和出队的操作决定 单调队列的经典用法 1.维持窗口滑动中的最大/最小值 维持了一个依次称为最大值的可能性! 增…

基于neo4j的学术论文关系管理系统

正在为毕业设计头疼?又或者在学术研究中总是找不到像样的工具来管理浩瀚的文献资料?今天给大家介绍一款超实用的工具——基于Neo4j的学术论文关系管理系统,让你轻松搞定学术文献的管理与展示!🎉 系统的核心是什么呢&a…

word删除空白页 | 亲测有效

想要删掉word里面的末尾空白页,但是按了delete之后也没有用 找了很久找到了以下亲测有效的方法 1. 通过鼠标右键在要删除的空白页面处显示段落标记 2. 在字号输入01,按ENTER(回车键) 3.成功删除了!! PS…

进程间通信(一)管道

文章目录 进程间通信进程间通信概述进程间通信的方式管道通信示例--基于管道的父子进程通信示例--使用管道进程兄弟进程通信 管道的读写特性示例--不完整管道(读一个写端关闭的管道)示例--不完整管道(写一个读端关闭的管道) 标准库…

Java实现文件上传功能

目录 1、准备工作 2、注意事项 3、jsp页面代码 4、Servlet 5、注册Servlet 1、准备工作 导入依赖:commons-fileupload和commons-io 2、注意事项 ①为保证服务器安全,上传文件应该放在外界无法直接访问的目录下,比如WEB-INF目录下 ②为…

Lua变量

软考鸭微信小程序 过软考,来软考鸭! 提供软考免费软考讲解视频、题库、软考试题、软考模考、软考查分、软考咨询等服务 Lua是一种轻量级的脚本语言,以其简单、高效和易于嵌入的特性而广受欢迎。在Lua中,变量是存储数据的容器,可以存储不同类型…

基于KU115+ZU19EG+C6678 的高性能6U VPX 载板

基于KU115ZU19EGC6678 的高性能6U VPX 载板,板载 2 个 HPC 形式的FMC 连接器(用于外部信号扩展)。板卡选用了 1 片Xilinx 公司的Kintex UltraScale 系列 FPGA 家族中的XCKU115-2FLVA1517I 和 1 片 Zynq UltraScale MPSoC 家族的XCZU19EG-2FFV…