定义
给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
使用场景
(1)某个简单的语言需要解释执行而且可以将该语言中的语句表示为一个抽象语法树时
(2)在某些特定的领域出现不断重复的问题时,可以将该领域的问题转化为一种语法规则下的语句,然后构建解释器来解释该语句。
UML类图
实现方式
符号表达式抽象类
public abstract class AbstractExpression{
public abstract int interpret(Context ctx);
}
终端符号表达式类
public class TerminalExpression extends AbstractExpression{
@Override
public int interpret(Context ctx){
return ctx.a;
};
}
非终端符号表达式类
public class NonterminalExpression extends AbstractExpression{
@Override
public intinterpret(Context ctx){
//do sth, e.g.Addition
return ctx.a + ctx.b;
};
}
上下文环境类
public class Context{
public int a,b;
}
处理类
public class Client{
public static void main(String [] args){
//...
}
}
解释器模式的优缺点
优点
>具有灵活的扩展性,当想对文法规则进行扩展延伸时,只需要增加相应的非终结符解释器,并在构建抽象语法树时,使用新增的解释器对象进行具体的解释即可
缺点
>会生成大量的解释器类,导致后期维护困难
>对于国语复杂的文法,构建抽象语法树会显得很繁琐。
Android中的解释器模型举例
Android系统源码中基本没有经典的解释器模式实现,但是PackageParser等类应用了解释器模式的原理进行实现。
——2017.08.29