时间: 2020-09-12|43次围观|0 条评论

定义

给定一门语言,定义它的文法的一种表示,并定义一种解释器,该解释器使用该表示来解释语言中的句子。

解释器模式的角色

1:抽象表达式角色(AbstractExpression)
该角色声明一个所有的具体表达式都需要实现的抽象接口,该接口主要是宇哥解释器操作interpret()方法。

public abstract class AbstractExpression{  public abstract Object interpret(Context ctx);}

2:终结符表达式(TerminalExpression)
该角色实现了抽象表达式中所要求的接口,文法中的每一个终结符都有具体终结表达式与之对应。

public class TerminalExpression extends AbstractExpression{  @Override  public Object interpret(Context ctx){    return null;  }}

3:非终结表达式(NotterminalExpression)
该角色是一个具体角色,文法中的每一条规则都对应一个非终结符表达式类。

public class NotterminalExpression extends AbstractExpression{  //每个非终结表达式都会对其他表达式产生依赖。  public NotterminalExpression(AbstractExpression expression){    //TO_DO  }  @Overrdie  public Object interpret(Context ctx){    return null;  }}

4:环境角色(Context)
该角色提供解释器之外的一些全局信息。

public class Context{  private HashMap map = new HashMap();  //TO_DO}

5:客户端角色(Client)
该角色创建一个抽象语法树,调用解释操作。

public class Client{  public static void main(String [] args){    Context ctx = new Context();    for(;;){      //自旋,进行语法判断,并产生递归调用    }  }}

优点

1:简单的语法分析工具。
2:扩展性良好,修改语法规则只需要修改响应得费终结表达式即可。

缺点

1:解释器模式会引起类膨胀。每个语法都要产生一个非终结表达式,语法比较复杂的时候可能会产生大量的类文件,不易于维护。
2:采用递归方法调用,不易调试,影响效率。

使用场景

重复发生的问题可以使用解释器模式。

解释器模式是一个非常少用的模式

参考资料:设计模式(java)

文章转载于:https://www.jianshu.com/p/9ca623b6cd6c

原著是一个有趣的人,若有侵权,请通知删除

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自起风了,原文地址《设计模式二十三–解释器模式
   

还没有人抢沙发呢~