Interpreter(解释器)–类行为型模式
一、意图
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
二、动机
1.在软件构建过程中,如果某一特定领域的问题比较复杂,类似的结构不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化。
2.在这种情况下,将特定领域的问题表达为某种语法规则下的句子,然后构建一个解释器解释这样的句子,从而达到解决问题的目的。
三、适用性
当一个语言需要解释器执行,并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。而存在以下情况时该模式效果最好。
1.该文法简单对于复杂的文法,文法的类层次变得庞大而无法管理。此时语法分析程序生成器这样的工具是更好的选择。它们无需构造抽象语法树即可解释表达式,这样可以节省空间而已还可以节省时间。
2.效率不是一个关键问题最高效的解释器通常不是通过直接解释语法分析树实现的,而是首先将它们转换成另一种形式。例如,正则表达式通常被转换为状态机。但即使在这种情况下,转换器仍可用解释器模式实现,该模式仍是有用的。
四、结构
五、效果
1.易于改变和扩展文法。 因为该模式使用类来表示文法规则,你可使用继承来改变或扩展该文法。已有的表达式可被增量式的改变,而新的表达式可定义为旧表达式的变体。
2.也易于实现文法。 定义抽象语法树中各个节点的类的实现大体类似。这些类易于直接编写,通常它们也可用一个编译器或语法分析程序生成器自动生成。
3.复杂的文法难以维护。 解释器模式为文法中的每一条规则至少定义了一个类。因此包含许多规则的文法可能难以管理和维护。可应用其他的设计模式来缓解这一问题。但当文法非常复杂时,其他的技术如语法分析程序或编译器生成器更为合适。
4.增加了新的解释器表达式的方式。 解释器模式使得实现新表达式“计算”变得容易。例如,你可以在表达式类上定义一个新的操作以支持优美打印或表达式的类型检查。如果你经常创建新的解释表达式的方式,那么可以考虑使用Visitor模式以避免修改这些代表文法的类。
六、实现
1.创建抽象语法树。
2.定义解释器。
3.与Flyweight模式共享终结符。
七、要点总结
1.Interpreter模式的应用场合是Interpreter模式应用中的难点,只有满足“业务规则频繁变化,且类似的结构不断重复出现,并且容易抽象为语法规则的问题”才适合使用Interpreter模式。
2.使用Interpreter模式来表示文法规则,从而可以使用面向对象技巧方便地“扩展”文法。
3.Interpreter模式比较适合简单的文法表示,对于复杂的文法表示,Interpreter模式会产生比较大的类层次结构,需要求租与语法分析生成器这样的标准工具。
八、相关模式
Composite模式:抽象语法树是一个复合模式的实例。
Flyweight模式:说明了如何在抽象语法树种共享终结符。
Iterator模式:解释器可用一个迭代器遍历该结构。
Visitor模式:可用来在一个类中维护抽象语法树中各个节点的行为。
九、举例说明
类似如翻译
本文为李建忠设计模式视频的笔记以及《设计模式-可复用面向对象的软件的基础》和自己的部分见解