解释器模式(Interpreter)
Interpreter 解释器模式——对象行为模式
1.意图
给的一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
2.适用性
当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。而当存在以下情况时该模式效果最好:
- 该文法简单对于复杂的文法,文法的类层次变得庞大而无法管理。此时语法分析程序生成器这样的工具是更好的选择。它们无需构建抽象语法树即可解释表达式,这样可以节省空间而且还可能节省时间。
- 效率不是一个关键问题最高效的解释器通常不是通过直接解释语法分析树实现的,而是首先将它们转换成另一种形式。例如,正则表达式通常被转换成状态机。但即使在这种情况下,转换器仍可用解释器模式实现,该模式仍是有用的。
3.结构
4.参与者
- AbstractExpression (抽象表达式,如RegularExpression)
—— 声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享。
- TerminalExpression (终结符表达式,如LiteralExpression)
—— 实现与文法中的终结符相关联的解释操作。
—— 一个句子中的每个终结符需要该类的一个实例。
- NonterminalExpression (非终结符表达式,如AlternationExpression, Repetition-Expression, SequenceExpressions)
—— 对文法中的每一条规则R := R,R, ..R都需要一个NonterminalExpression类。
—— 为从R,到R的每个符号都维护一个AbstractExpression类型的实例变量。
—— 为文法中的非终结符实现解释(Interpret)操作。解释(Interpret)一般要递归地调用表示R,到R,的那些对象的解释操作。
- Context (上下文)
—— 包含解释器之外的一些全局信息。
- Client (客户)
—— 一构建(或被给定)表示该文法定义的语言中一个特定的句子的抽象语法树。该抽象语法树由NonterminalExpression和TerminalExpression的实例装配而成。
—— 调用解释操作。
5.协作
- Client构建(或被给定)一个句子,它是NonterminalExpression和TerminalExpression的实例的一个抽象语法树,然后初始化上下文并调用解释操作。
- 每一非终结符表达式节点定义相应子表达式的解释操作。而各终结符表达式的解释操作构成了递归的基础。
- 每一节点的解释操作用上下文来存储和访问解释器的状态。
6.效果
优点:
1)易于改变和扩展文法 可以方便地实现一个简单的语言
2)实现文法较为容易(有自动生成工具) 增加新的解释表达式较为方便
缺点:
1)对于复杂文法难以维护 执行效率较低
设计模式系列 https://blog.csdn.net/nie2314550441/article/details/105849726