设计模式二十三--解释器模式

定义

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

解释器模式的角色

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)

你可能感兴趣的:(设计模式二十三--解释器模式)