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

简介: 在生活中我们往往没听懂别人说的话,需要别人详细的解释一遍,才明白其中的意思。在学习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 文档解释。

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

相关文章
|
6月前
|
设计模式 移动开发 数据库
行为型设计模式10-解释器模式
行为型设计模式10-解释器模式
47 1
|
2天前
|
设计模式 存储 Java
小谈设计模式(28)—解释器模式
小谈设计模式(28)—解释器模式
|
1月前
|
设计模式
【设计模式】解释器模式
【设计模式】解释器模式
|
3月前
|
设计模式 监控 Java
聊聊Java设计模式-解释器模式
解释器模式(Interpreter Design Pattern)指给定一个“语言”,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。这里所指的“语言”是指使用规定格式和语法的代码。
34 4
聊聊Java设计模式-解释器模式
|
3月前
|
设计模式 Go 开发工具
Golang设计模式——18解释器模式
Golang设计模式——18解释器模式
22 0
Golang设计模式——18解释器模式
|
3月前
|
设计模式 存储 前端开发
【设计模式】之解释器模式
解释器模式是一种用于解释特定语言或规则的表达式的行为设计模式。在前端开发中,解释器模式可以用于处理复杂的逻辑或规则,并将其转化为可执行的代码。它具有灵活性和可扩展性的优点,但也存在复杂性和性能问题的缺点。通过合理地应用解释器模式,可以提高代码的可读性和可维护性,实现更灵活和可扩展的功能。
42 1
|
4月前
|
设计模式 存储 缓存
二十三种设计模式全面解析-探索解释器模式如何应对性能挑战
二十三种设计模式全面解析-探索解释器模式如何应对性能挑战
|
4月前
|
设计模式 存储 缓存
二十三种设计模式全面解析-探索解释器模式的高级应用和优化技巧:解锁代码解析的新境界
二十三种设计模式全面解析-探索解释器模式的高级应用和优化技巧:解锁代码解析的新境界
|
4月前
|
设计模式 自然语言处理 编译器
二十三种设计模式全面解析-解释器模式(Interpreter Pattern):用代码诠释语言的魅力
二十三种设计模式全面解析-解释器模式(Interpreter Pattern):用代码诠释语言的魅力
|
4月前
|
设计模式 SQL 应用服务中间件
设计模式之解释器模式
设计模式之解释器模式