版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fengyu6623/article/details/88078452
什么是解释器模式
解释器模式是为自定义语法解释的一种方案设计模式。
为什么要用解释器模式
当在项目中定义了特定的自定义语法表达式,并需要解析执行计算执行时,就可以考虑解释器模式。比如定义加减运算表达式,形如a+b+c,并传递相应的参数值,而对表达式进行解析,最终计算出结果。以a+b+c这个表达式为例,表达式分为两种,一是终结表达式即结果数字a,b,c。二是非终结表达式即这里的+号。
解释器模式的组成
抽象表达式
public abstract class Expression {
//表达式解析方法,Context是上下文,里面可以存解析器必要的实际参数,可以是Map
public abstract Object interpreter(Context ctx);
}
终结表达式
public class TerminalExpression extends Expression {
@Override
public Object interpreter(Context ctx) {
return null;
}
}
非终结表达式
public class NonterminalExpression extends Expression {
public NonterminalExpression(Expression ... expressions) {
}
@Override
public Object interpreter(Context ctx) {
//处理关联多个具体的表达式
return null;
}
}
计算客户类
public class Client {
private String expr;
public Client(String expr) {
this.expr = expr;
}
public void calc(Context ctx) {
//对表达式存储
Stack<Expression> stack = new Stack<>();
char[] chars = expr.toCharArray();
for (int i = 0; i < chars.length; i++) {
//处理具体表达式 expr,并将翻译的表达式存储进stack
}
Expression exp = stack.pop();
exp.interpreter(ctx);
}
}
解释器模式的缺点
解释器的运行最终通过递归一层一层将非终结表达式递归到终结表达式,最后运算出结果,所以带来的问题是程序执行的效率会降低,并且给调试带来了困难。而且随着表达式的复杂,会带来对象的膨胀,对速度和内存损耗都是需要考虑的一个方面。