1、意图
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
2、适用性
(1)该文法简单对于复杂的文法,文法的类层次变得庞大而无法管理。
(2)效率不是一个关键问题最高效的解释器通常不是通过直接解释语法分析树实现的,而是首先将它们转换成另一种形式。
3、参与者
(1)AbstractExpression:声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享
(2)TerminalExpression:实现与文法中的终结符相关联的解释操作;一个句子中的每个终结符需要该类的一个实例
(3)NonterminalExpression:对文法中的每一条规则都需要一个NonterminalExpression类
(4)Context:包含解释器之外的一些全局信息
(5)Client:构建表示该文法定义的语言中的一个特定的句子的抽象语法树;调用解释操作
6、协作
(1)Client构建一个句子,它是NonterminalExpression和TerminalExpression的实例的一个抽象语法树,然后初始化上下文并调用解释操作
(2)每一个非终结符表达式节点定义相应子表达式的解释操作。而各终结表达式的解释操作构成了递归的基础
(3)每一节点的解释操作作用上下文来存储和访问解释器的状态
7、效果
(1)易于改变和扩展方法:因为该模式使用类来表示文法规则,你可使用继承来改变或扩展该文法。已有的表达式可被增量式地改变,而新的表达式可定义为旧表达式的变体
(2)也易于实现文法:定义抽象语法树中各个节点的类的实现大体类似。这些类易于直接编写,通常它们也可用一个编译器或语法分析程序生成器自动生成。
(3)复杂的文法难以维护:解释器模式为文法中的每一条规则至少定义了一个类。因此包含许多规则的文法可能难以管理和维护。可应用其他的设计模式来缓解这一问题。但当方法非常复杂时,其他的技术如语法分析程序或编译器生成器更为合适 。
(4)增加了新的解释表达式的方式:解释器模式使得实现新表达式”计算“变得容易。