-
解释器模式的定义
Given a language, define a representation for its grammar along with an interpreter that uses the representation to interpret sentences in the language(给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。) -
解释器模式的应用
-
解释器模式的优点
可以很容易地改变和扩展方法, 因为该模式使用类来表示方法规则, 你可以使用继承来改变或扩展该方法。
也比较容易实现方法, 因为定义抽象语法树总各个节点的类的实现大体类似, 这些类都易于直接编写。
解释器模式就是将一句话,转变为实际的命令程序执行而已。 而不用解释器模式本身也可以分析, 但通过继承抽象表达式的方式, 由于依赖转置原则, 使得文法的扩展和维护都带来的方便。
-
解释器模式的缺点
解释器模式为方法中的每一条规则至少定义了一个类, 因此包含许多规则的方法可能难以管理和维护。 因此当方法非常复杂时, 使用其他的技术如 语法分析程序 或 编译器生成器来处理。
-
解释器模式的使用场景。
当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树,可以使用解释器模式。而当存在以下情况时该模式效果最好
该文法的类层次结构变得庞大而无法管理。此时语法分析程序生成器这样的工具是最好的选择。他们无需构建抽象语法树即可解释表达式,这样可以节省空间而且还可能节省时间。
效率不是一个关键问题,最高效的解释器通常不是通过直接解释语法分析树实现的,而是首先将他们装换成另一种形式,例如,正则表达式通常被装换成状态机,即使在这种情况下,转换器仍可用解释器模式实现,该模式仍是有用的
-
-
解释器模式的实现
//抽象表达式 public abstract class Expression { //每个表达式必须有一个解析任务 public abstract Object interpreter(Context ctx); } //终结符表达式 public class TerminalExpression extends Expression { //通常终结符表达式只有一个,但是有多个对象 public Object interpreter(Context cxt){ return null; } } //非终结表达式 public class NonterminalExpression extends Expression { //每个非终结表达式都会对其他表达式产生依赖 public NonterminalExpression (Expression... expression){ } public Object interpreter(Context cxts){ //进行文法处理 return null; } } //客户类 public class Client { public static void main(String[] args){ Context ctx = new Context(); Stack<Expression> stack = null; for(;;){ //进行语法判断,并产生递归调用 } //产生一个完整的语法树,由各个具体的语法分析进行解析 Expression exp = stack.pop(); //具体元素进入场景 exp.interpreters(ctx); } }
-
解释器模式源码中的应用
PackageParser 为 Activity、Service、Provider 等组件在其内部以内部类的方式创建了对应的类,按照解释器模式的定义,这些类都对应 AndroidManifest.xml 文件中的一个标签,也就是一条文法,其在对该配置文件解析时充分运用了解释器模式分离实现、解释执行的特性。