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

news2024/10/25 12:16:07

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

介绍

解释器模式(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;
    }

    @Override
    public 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;
    }

    @Override
    public 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;
    }

    @Override
    public int interpret() {
        return leftExpression.interpret() - rightExpression.interpret();
    }
}

调用:

public class InterpreterDemo {
    public static void main(String[] args) {
        // 表达式:3 + 5
        Expression three = new Number(3);
        Expression five = new Number(5);
        Expression add = new Add(three, five);

        System.out.println("Result: " + add.interpret());  // 输出: Result: 8

        // 表达式:10 - 2
        Expression 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.coloradmin.cn/o/2223264.html

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

相关文章

【资深码农】环境搭建篇

导航 MockingBird仿生环境搭建seleniumchrome爬虫环境搭建1.1 安装selenium1.2 安装chrome driver1.3 测试1.4 常见问题驱动不一致原因解决办法最新版本获取 自动下载驱动 NLTK环境搭建opencv环境搭建pytorch环境搭建pyspark环境搭建1 安装环境1.1 jdk下载安装1.2 Scala下载安装…

零售行业 Web EDI 解决方案——知行之云LIP系统操作详解

通过浏览器,用户可以轻松访问知行之云LIP系统,便捷管理订单、发货等操作。如何低成本、高效地实现与主流电商平台的EDI对接?用户对接不同的交易伙伴,可能会遇到不同的EDI需求,这时就需要做个性化定制。本文将以零售行业…

Redis+Lua限流的四种算法

1. 固定窗口(Fixed Window) 原理: 固定窗口算法将时间划分为固定的时间段(窗口),比如 1 秒、1 分钟等。在每个时间段内,允许最多一定数量的请求。如果请求超出配额,则拒绝。 优点…

解锁流量密码:TikTok常见引流方式分享

在这个TikTok这个竞争激烈但又遍布商机的平台上,如何有效地引流,尤其是对于新手来说,是一个重要的课题。本文将详细介绍TikTok的几种常见引流方式,并为新手提供切实可行的引流策略,以帮助他们在平台上获得更高的曝光率…

Java 字节流:高效处理二进制数据

前言 字节流是 Java I/O 系统的一部分,专门用于处理字节数据。由于所有数据在计算机中最终都以字节形式存在,这意味着字节流可以操作任何类型的数据,包括文本、图片、视频等。 Java 提供了多种字节流类,这些类继承自 InputStrea…

Python 爬虫项目实战:爬取某云热歌榜歌曲

一、网络爬虫的定义 网络爬虫(Web Crawler),也成为网页蜘蛛或者网页机器人,是一种按照既定规则自动浏览网络并提取信息的程序。爬虫的主要用途包括数据采集、网络索以及内容抓取等。 二、爬虫基本原理 1、种子URL:爬…

使用Python循环地画一个简单的爱心 - 烂漫教程

运行软件:pycharm 画一个爱心的代码: import turtle def print_love1():# 设置画笔颜色和粗细turtle.pencolor("red")turtle.pensize(6)# 绘制爱心turtle.fillcolor("pink")turtle.begin_fill()turtle.left(45)turtle.forward(100…

新鲜出炉面试题之【说说spring spring MVC spring boot的区别】

Spring MVC 和 Spring Boot 是 Spring 框架的一部分,但它们的目的和用途有所不同。下面详细阐述这两者之间的区别。 1. 概念 Spring MVC: Spring MVC 是一种基于请求-响应模式的 Web 框架,属于 Spring 框架的一部分。它提供了一种分离的方式…

【Jenkins】解决在Jenkins Agent节点容器内无法访问物理机的docker和docker compose的问题

解决在Jenkins Agent节点容器内无法访问物理机的docker和docker compose的问题 1. 确定物理机docker和docker compose已经安装2. 编写Jenkins Agent结点docker-compose.yaml配置文件3. 修改docker运行时文件权限4. 启动容器并验证 最近接触到一个发布产物是一个 docker镜像的项…

ORACLE 的SCHEDULER创建JOB

JOB_NAME:指定任务的名称,必选值,注意要确保指定的名称唯一。 JOB_TYPE:任务执行的操作类型,必选值,STORED_PROCEDURE:表示任务执行的是 ORACLE 存储过程。 JOB_ACTION:任务执行的操…

Pendle protocol

道阻且长,行而不辍,未来可期 我身边多是聪明的人&我一直认为我不是那个会学习的人,以往看官方文档,总有许多理解不透的地方,需要靠众多博主的白话分析才能理解,but,在学习Pendle protocol的时候&#x…

进行FMEA时需要考虑哪些历史数据?

在进行FMEA(Failure Modes and Effects Analysis,即故障模式与影响分析)时,历史数据扮演着至关重要的角色。这些数据不仅为分析提供了坚实的基础,还帮助团队更准确地预测潜在故障模式,评估其影响&#xff0…

uni-app 开发微信小程序,实现图片预览和保存

1.使用 uni.previewImage() 预览图片 1.1 图片列表 1.2 预览 1.2.1 样式无法调整 1.2.2 微信小程序不支持预览本地文件路径图片(图片上传到小程序的临时文件存储或云服务存储) 1.3 无法绑定 longpress"saveImage(item)" 长按保存图片事件 …

C++,STL 044(24.10.24)

内容 1.set容器的构造函数。 2.set容器的赋值操作。 运行代码 #include <iostream> #include <set>using namespace std;void printSet(set<int> &s) {for (set<int>::iterator it s.begin(); it ! s.end(); it){cout << *it << &…

充电宝目前什么牌子的质量好耐用?盘点2024年五款高性价充电宝!

充电宝目前什么牌子的质量好耐用&#xff1f;这是许多人在选购充电宝时最为关心的问题。随着移动设备的普及和技术的进步&#xff0c;充电宝已经成为日常生活中不可或缺的伴侣。为了帮助大家在众多品牌中做出明智的选择&#xff0c;我特地盘点了2024年五款具有高性价比的充电宝…

跨境科技公司如何借助 NocoBase 升级内部系统并实现外部业务增长?

关于政元软件 深圳市政元软件有限公司&#xff0c;作为国家级高新技术企业和专精特新企业&#xff0c;自 2006 年成立以来&#xff0c;一直走在跨境企业服务的前沿。近年来&#xff0c;政元软件将人工智能技术与跨境业务场景结合&#xff0c;为客户提供创新的解决方案&#xff…

数据结构——树、二叉树和森林间的转换

前言 介绍 &#x1f343;数据结构专区&#xff1a;数据结构 参考 该部分知识参考于《数据结构&#xff08;C语言版 第2版&#xff09;》129~130页 &#x1f308;每一个清晨&#xff0c;都是世界对你说的最温柔的早安&#xff1a;ૢ(≧▽≦)و✨ 目录 前言 1、基础知识 2…

现场总是发生急停,很可能是PLC和设置间网络中断

如果你的现场总是发生急停&#xff0c;很可能是PLC和设置间网络中断&#xff0c;本文用一个真实案例告诉你问题背后的原因和解决方法&#xff01; 这是一台生产汽车配件的机器&#xff0c;使用1500F的控制器连接机器人控制器&#xff0c;现场装置总会莫名其妙的发生急停故障。…

Linux运维_搭建smb服务

Samba&#xff08;SMB&#xff09;是一个开源软件&#xff0c;允许Linux和Unix系统与Windows系统共享文件和打印机。以下是一些关于Samba和SMB的基本信息和操作步骤&#xff1a; Samba 和 SMB 基本概念 Samba&#xff1a;实现了SMB&#xff08;Server Message Block&#xff…

程序员中后期,靠什么和其他人拉开差距?

有人说程序员是吃青春饭的&#xff0c;到了35岁会被淘汰。但和身边几十位程序员聊完后&#xff0c;发现实际情况不尽如此&#xff01; 工作两三年的时候&#xff0c;有些程序员技术优势明显&#xff0c;看起来职业前途很好&#xff1b;工作四五年后&#xff0c;该学的技术都熟…