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

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

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

介绍

解释器模式(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.kler.cn/news/364114.html

相关文章:

  • Linux使用Dockerfile部署Tomcat以及jdk
  • Java语言-接口(下)
  • wx.reLaunch和wx.miniProgram.navigateTo
  • 关于写“查看IT设备详细信息”接口的理解
  • 《上海大学学报(自然科学版)》
  • 刷题 - 图论
  • 介绍 TensorFlow 的基本概念和使用场景(AI生成仅供参考)
  • 读数据工程之道:设计和构建健壮的数据系统19数据存储系统 (下)
  • 基于neo4j的疫情信息管理系统
  • 【WebSocket实战】——创建项目初始架构
  • Linux 设备树在 i.MX6U 上的应用与详解
  • 基于 Python 的自然语言处理系列(43):Question Answering
  • 架构设计(17)大数据框架Hadoop与基础架构CDH
  • 又是一年 1024
  • Python酷库之旅-第三方库Pandas(167)
  • 鸿蒙原生 证书 打包到真机
  • 使用docker-compose部署一个springboot项目(包含Postgres\redis\Mongo\Nginx等环境)
  • STL标准容器库
  • 【华为HCIP实战课程十七】OSPF的4类及5类LSA详解,网络工程师
  • nginx------HTTP模块配置详解
  • 什么是虚拟线程?Java 中虚拟线程的介绍与案例演示
  • 【Unity实战笔记】第二一 · 基于状态模式的角色控制——以UnityChan为例
  • ArcGIS计算落入面图层中的线的长度或面的面积
  • 十七、行为型(命令模式)
  • 社区团购在一线城市的新机遇:定制开发小程序助力用户细分
  • Lua简介