设计模式21——解释器模式

  1. 解释器模式的定义 

    Given a language, define a representation for its grammar along with an interpreter that uses the representation to interpret sentences in the language(给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。)
  2. 解释器模式的应用 

    1. 解释器模式的优点 

      可以很容易地改变和扩展方法, 因为该模式使用类来表示方法规则, 你可以使用继承来改变或扩展该方法。

      也比较容易实现方法, 因为定义抽象语法树总各个节点的类的实现大体类似, 这些类都易于直接编写。

      解释器模式就是将一句话,转变为实际的命令程序执行而已。 而不用解释器模式本身也可以分析, 但通过继承抽象表达式的方式, 由于依赖转置原则, 使得文法的扩展和维护都带来的方便。

    2. 解释器模式的缺点

      解释器模式为方法中的每一条规则至少定义了一个类, 因此包含许多规则的方法可能难以管理和维护。 因此当方法非常复杂时, 使用其他的技术如 语法分析程序 或 编译器生成器来处理。

       
    3. 解释器模式的使用场景。

      当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树,可以使用解释器模式。而当存在以下情况时该模式效果最好

      该文法的类层次结构变得庞大而无法管理。此时语法分析程序生成器这样的工具是最好的选择。他们无需构建抽象语法树即可解释表达式,这样可以节省空间而且还可能节省时间。

      效率不是一个关键问题,最高效的解释器通常不是通过直接解释语法分析树实现的,而是首先将他们装换成另一种形式,例如,正则表达式通常被装换成状态机,即使在这种情况下,转换器仍可用解释器模式实现,该模式仍是有用的

  3. 解释器模式的实现

    //抽象表达式
    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);
            
        }
    }

  4. 解释器模式源码中的应用

    PackageParser 为 Activity、Service、Provider 等组件在其内部以内部类的方式创建了对应的类,按照解释器模式的定义,这些类都对应 AndroidManifest.xml 文件中的一个标签,也就是一条文法,其在对该配置文件解析时充分运用了解释器模式分离实现、解释执行的特性。

               

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值