这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战
概述
解释器模式(Interpreter Pattern):定义一个语言的文法,并且建立一个解释器来解释该语言中的句子,它是一种类行为型模式。
结构
-
Context(环境类):又称为上下文类,用于存储解释器之外的全局信息,通常它用来临时存储需要解释的语句。
-
AbstractExpression(抽象表达式):声明了抽象的解释操作,是所有终结符表达式和非终结符表达式的公共父类。
-
TerminalExpression(终结符表达式):抽象表达式的子类,实现了文法中与终结符相关的解释操作,句子中的每个终结符都是该类的实例。
-
NonterminalExpression(非终结符表达式):抽象表达式的子类,实现了文法中与非终结符相关的解释操作。在非终结符表达式中可以包含终结符表达式,也可以继续包含非终结符表达式,因此其解释操作一般通过递归来完成。
优点
- 修改语法规则只需修改相应的非终结表达式就可以了,若扩展语法,只要增加非终结符类就可以了,扩展方便。
- 在抽象语法树中每一个表达式节点类的实现方式都是相似的,实现文法较为容易。
- 增加新的解释表达式,只需增加一个新的终结符表达式或非终结符表达式,原有表达式类代码无须修改,符合开闭原则。
缺点
- 每一个语法都要产生一个非终结符表达式,语法规则比较复杂时,就可能产生大量的类文件,不利于维护。
- 由于使用了大量的循环和递归,执行效率较低。
应用场景
- 重复出现的问题。
- 将一个需要解释执行的语言中的句子表示为一个抽象语法树。
- 语言的文法较为简单,执行效率要求不高。
JDK 中的应用
JDK 中的解释器模式:
java.text.Normalizer
java.text.Format