设计模式轻松学【二四】解释器模式

简介: 在生活中我们往往没听懂别人说的话,需要别人详细的解释一遍,才明白其中的意思。在学习Java的过程中我们不明白某个知识点,也需要有详细的解释才能让我们明白其中的韵味。对于编程语言来说也一样,JDK就是java运行提供的一种解释器,所以解释器模式就是去解析某个东西。

定义与特点

  • 定义:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

    简单概述为:我们可以定义一种语言或语法作为被分析对象,然后定义一个解析器来解析该语言对象。

    • 文法:语法规则,如中文中的主、谓、宾。程序中json规则、xml语法规则
    • 句子:语句中的元素,如中文句子,我是大学生。程序中json串,xml文档
    • 语法树:语法树是句子结构的一种树型表示,它代表了句子的推导结果,它有利于理解句子语法结构的层次。

      image.png

    解释器模式的结构与组合模式相似,不过其包含的组成元素比组合模式多,而且组合模式是对象结构型模式,而解释器模式是类行为型模式。它是23种设计模式中最难理解,最少使用的一种设计模式。

  • 参与角色

    • 抽象表达式(Abstract Expression):定义解释器的接口,约定解释器的解释操作,主要包含解释方法 interpret()。
    • 终结符表达式(Terminal Expression):实现与文法中的元素相关联的解释操作,通常一个解释器模式中只有一个终结表达式,但有多个实例,对应不同的终结符。
    • 非终结符表达式(Nonterminal Expression):文法中的每条规则对应于一个非终结表达式,非终结符表达式根据逻辑的复杂程度而增加。
    • 上下文(Context): 上下文环境类,包含解释器之外的全局信息 ,一般用来传递被所有解释器共享的数据,后面的解释器可以从这里获取这些值。
    • 客户类(Client): 主要任务是将需要分析的句子或表达式转换成使用解释器对象描述的抽象语法树,然后调用解释器的解释方法,当然也可以通过环境角色间接访问解释器的解释方法。
  • 类结构图

    image.png

  • 类结构示例

    • 定义抽象表达式类

      interface AbstractExpression {
          public Object interpret(String info); // 解释方法
      }
    • 定义终结符表达式类

      class TerminalExpression implements AbstractExpression {
          public Object interpret(String info) {
              // 对终结符表达式的处理
              return null;
          }
      }
    • 定义非终结符表达式类

      class NonterminalExpression implements AbstractExpression {
          private AbstractExpression exp1;
          private AbstractExpression exp2;
      
          public Object interpret(String info) {
              // 非对终结符表达式的处理
              return null;
          }
      }
    • 环境类

      class Context {
          private AbstractExpression exp;
      
          public Context() {
              // 数据初始化
          }
      
          public void operation(String info) {
              // 调用相关表达式类的解释方法
          }
      }
    • 客户端调用类

总结

  1. 优点

    • 解释器是一个简单的语法分析工具,它最显著的优点就是扩展性。
    • 修改语法规则只需要修改相应的非终结符就可以了
    • 若扩展语法,只需要增加非终结符类就可以了。
  2. 缺点

    • 需要建大量的类,因为每一种语法都要建一个非终结符的类,会引起类膨胀。。
    • 解释的时候采用递归调用方法,导致有时候函数的深度会很深,执行效率较低。
  3. 适用场景

    • 当语言的文法较为简单,且执行效率不是关键问题时。
    • 当问题重复出现,且可以用一种简单的语言来进行表达时。
    • 当一个语言需要解释执行,并且语言中的句子可以表示为一个抽象语法树的时候,如 XML 文档解释。

注意:解释器模式在实际的软件开发中使用比较少,因为它会引起效率、性能以及维护等问题。

目录
相关文章
|
设计模式 移动开发 数据库
行为型设计模式10-解释器模式
行为型设计模式10-解释器模式
97 1
|
2月前
|
设计模式 存储 缓存
Java设计模式 - 解释器模式(24)
Java设计模式 - 解释器模式(24)
|
6月前
|
设计模式 SQL Java
【设计模式】抖音一面:你不知道解释器模式?
【设计模式】抖音一面:你不知道解释器模式?
51 1
|
6月前
|
设计模式 Go
[设计模式 Go实现] 行为型~解释器模式
[设计模式 Go实现] 行为型~解释器模式
|
6月前
|
设计模式 存储 Java
小谈设计模式(28)—解释器模式
小谈设计模式(28)—解释器模式
|
6月前
|
设计模式 存储 Java
23种设计模式,解释器模式的概念优缺点以及JAVA代码举例
【4月更文挑战第7天】解释器模式是一种行为设计模式,它用于定义一个语言的语法表示,并提供一个解释器来处理这种语法。主要用于频繁需要解释执行一组固定语法规则的场景,例如编程语言解释器、规则引擎等。
45 3
|
6月前
|
设计模式 存储 SQL
【设计模式系列笔记】解释器模式
解释器模式(Interpreter Pattern)是一种行为型设计模式,它定义了一种语言的文法,并且建立一个解释器来解释该语言中的句子。在Java中,解释器模式通常用于实现编程语言解释器、正则表达式解释器等。
59 0
|
6月前
|
设计模式
【设计模式】解释器模式
【设计模式】解释器模式
|
6月前
|
设计模式 监控 Java
聊聊Java设计模式-解释器模式
解释器模式(Interpreter Design Pattern)指给定一个“语言”,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。这里所指的“语言”是指使用规定格式和语法的代码。
80 4
聊聊Java设计模式-解释器模式
|
6月前
|
设计模式 Go 开发工具
Golang设计模式——18解释器模式
Golang设计模式——18解释器模式
51 0
Golang设计模式——18解释器模式