解释器模式-Interpreter
名称:
解释器模式(Interpreter Pattern)-类行为模式
问题:
The Interpreter pattern interprets a language to define a representation for its grammar along with an interpreter that uses the representation to interpret sentences in the language.
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
适用性:
-当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。
-该文法简单对于复杂的文法,文法的类层次变得庞大而无法管理。
-效率不是一个关键问题。最高效的解释器通常不是通过直接解释语法分析树实现的,而是首先将它们转换成另一种形式。例如,正则表达式通常被转换成状态机。
协作:
-Client构建一个句子,它是NonterminalExpression和TerminalExpression的实例的一个抽象语法树,然后初始化上下文并调用解释操作。
-每一非终结符表达式节点定义相应子表达式的解释操作。而各终结符表达式的解释操作构成了递归的基础。
-每一节点的解释操作用上下文来存储和访问解释器的状态。
优点和缺点:
1、易于改变和扩展文法。
2、也易于实现文法。
3、复杂的文法难以维护。
4、增加了新的解释表达式的方式。
解决方案:
1、 模式的参与者
1、AbstractExpression
-声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享。
2、TerminalExpression
-实现与文法中的终结符相关联的解释操作。
-一个句子中的每个终结符需要改类的一个实例。
3、NoterminalExpression
-对文法中的每一条规则R::==R1R2...Rn都需要一个NoterminalExpression类。
-为从R1到Rn的每个符号都维护一个AbstractExpression类型的实例变量。
-为文法中的非终结符实现解释(Interpret)。解释一般递归的调用表示R1到Rn的那些对象的解释操作。
4、Context 上下文
-构建(或被给定)表示该文法定义的语言中一个的特定的句子的抽象语法树。该抽象语法树由NonterminalExpression和TerminalExpression的实例装配而成。
-调用解释操作。
2.实现方式
interface AbstractExpression { public Object interpret(String info); }
class TerminalExpression implements AbstractExpression { public Object interpret(String info) { } }
class NonterminalExpression implements AbstractExpression { private AbstractExpression exp1; private AbstractExpression exp2; public Object interpret(String info) { } }
class Context { private AbstractExpression exp; public Context() { } public void operation(String info) { } }
参考资料
《设计模式:可复用面向对象软件的基础》