定义
给定一门语言,定义它的文法的一种表示,并定义一种解释器,该解释器使用该表示来解释语言中的句子。
解释器模式的角色
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
原著是一个有趣的人,若有侵权,请通知删除
还没有人抢沙发呢~