一、解释器模式简介(Brief Introduction)
解释器模式(Interpreter Pattern),给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。使用了解释器模式,可以很容易地改变和扩展文法,因为该模式使用类来表示文法规则,可以使用继承来改变或扩展该文法。也比较容易实现文法,因为定义抽象语法树中各个节点的类的实现大体类似,这些类容易直接编写。二、解决的问题(What To Solve)
如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子,这样就可以构建一个解释器,该解释器通过解释这些句子来解决问题。三、解释器模式分析(Analysis)
AbstractExpression:定义解释器的接口,约定解释器的操作
TerminalExpression:终结符解释器,用来实现语法规则中和终结符相关的操作,
不再包含其他的解释器,如果用组合模式来构建抽象语法树的话,就相当于组合模式中的叶子对象,可以有多种终结符解释器
NonterminalExpression:非终结符解释器,用来实现语法规则中非终结符相关的操作,通常一个解释器对应一个语法规则,可以包含其他的解释器,如果用组合模式来构建抽象语法树的话,就相当于组合模式中的组合对象。可以有多种非终结符解释器
Context:上下文,通常包含各个解释器需要的数据或是公共的功能
Client:客户端,指的是使用解释器的客户端,通常在这里将按照语言的语法做的表达式转换成为使用解释器对象描述的抽象语法树,然后调用解释操作
四、实例代码
1、上下文Context
public class Context {
public void print(){
System.out.println("=======利用上下文数据========");
}
}
2、解释器接口及其实现
public abstract class AbstractExpression {
public abstract void interpret(Context context);
}
public class TerminalExpression extends AbstractExpression {
public void interpret(Context context) {
context.print();
System.out.println("调用终止符表达式Terminal.Interpret()");
}
}
public class NoTerminalExpression extends AbstractExpression {
public void interpret(Context context) {
context.print();
System.out.println("调用非终止符表达式 Nonterminal.Interpret()");
}
}
3、客户端调用
public class Client {
public static void main(String[] args) {
Context context = new Context();
TerminalExpression te = new TerminalExpression();
NoTerminalExpression nte = new NoTerminalExpression();
te.interpret(context);
nte.interpret(context);
}
}
运行结果: