解释器模式,给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。解释器模式需要解决的是,如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。解释器模式结构图如下所示: AbstractExpression(抽象表达式),声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享。
TerminalExpression(终结符表达式),实现与文法中的终结符相关联的解释操作。实现抽象表达式中所要求的接口,主要是一个interpret方法。文法中每一个终结符都有一个具体终结表达式与之相对应。
NonterminalExpression(非终结符表达式),为文法中的非终结符实现解释操作。对文法中每一条规则R1,R2 …. Rn都需要一个具体的非终结符表达式类。通过实现抽象表达式的interpret方法实现解释操作。解释操作以递归方式调用上面所提到的代表R1,R2…..Rn中各个符号的实例变量。
Context,包含解释器之外的一些全局信息。
客户端代码,构建表示该文法定义的语言中一个特定句子的抽象语法树,调用解释操作:
当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。解释器模式为文法中的每一条规则至少定义了一个类,因此包含许多规则的文法可能难以管理和维护。建议当文法非常复杂时,使用其他技术如语法分析程序或编译器生成器来处理。
解释器模式优缺点:
优点:
- 可扩展性比较好,灵活
- 增加了新的解释器表达式的方式
- 易于实现文法
缺点:
- 执行效率比较低,可利用场景比较少
- 对于复杂的文法比较难以维护
解释器模式适用场景:
- 可以将一个需要解释执行的语言中的句子表示为一个抽象语法树
- 一些重复出现的问题可以用一种简单的语言来进行表达
- 文法较为简单
解释器案例:计算器就是一个解释器,把输入的表达式字符串按文法解释为最后的值。
解释器模式总结:
- 在解释器模式中由于语法由很多类表示的,所以可扩展性强
- 虽然解释器的可扩展性强,但是如果语法规则的数目太大的时候,该模式可能就会变得异常复杂,所以解释器模式适用于文法较为简单的。
- 解释器模式可以处理脚本语言和编程语言。常用于解决某一特定类型的问题频繁发生情况。