从JDK中学习设计模式——解释器模式

这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战

概述

解释器模式(Interpreter Pattern):定义一个语言的文法,并且建立一个解释器来解释该语言中的句子,它是一种类行为型模式

结构

解释器模式UML.png

  • Context(环境类):又称为上下文类,用于存储解释器之外的全局信息,通常它用来临时存储需要解释的语句。

  • AbstractExpression(抽象表达式):声明了抽象的解释操作,是所有终结符表达式和非终结符表达式的公共父类。

  • TerminalExpression(终结符表达式):抽象表达式的子类,实现了文法中与终结符相关的解释操作,句子中的每个终结符都是该类的实例。

  • NonterminalExpression(非终结符表达式):抽象表达式的子类,实现了文法中与非终结符相关的解释操作。在非终结符表达式中可以包含终结符表达式,也可以继续包含非终结符表达式,因此其解释操作一般通过递归来完成

优点

  1. 修改语法规则只需修改相应的非终结表达式就可以了,若扩展语法,只要增加非终结符类就可以了,扩展方便
  2. 在抽象语法树中每一个表达式节点类的实现方式都是相似的,实现文法较为容易
  3. 增加新的解释表达式,只需增加一个新的终结符表达式或非终结符表达式,原有表达式类代码无须修改,符合开闭原则

缺点

  1. 每一个语法都要产生一个非终结符表达式,语法规则比较复杂时,就可能产生大量的类文件,不利于维护
  2. 由于使用了大量的循环和递归,执行效率较低

应用场景

  1. 重复出现的问题。
  2. 将一个需要解释执行的语言中的句子表示为一个抽象语法树。
  3. 语言的文法较为简单,执行效率要求不高。

JDK 中的应用

JDK 中的解释器模式:

  • java.text.Normalizer
  • java.text.Format

Guess you like

Origin juejin.im/post/7032693463720624135