源码地址 | https://github.com/DingMouRen/DesignPattern |
---|
- AbstractExperssion 抽象表达式。声明一个抽象的解释操作父类,并定义一个抽象的解释方法,其具体的实现在各个具体的子类解释器中完成。
- TerminalExpression 终结符表达式。实现文法中与终结符有关的解释器操作。文法中每一个终结符都有一个具体的终结表达式与之对应。
- NoterminalExpression 非终结符表达式。实现文法中与非终结符有关的解释器操作。
- Context 上下文环境类 。包含解释器之外的全局信息
定义
解释器模式给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用这种表示解释语言中的句子。
使用场景
当一个语言需要解释执行,并且可将该语言中的句子表示为一个抽象语法树,可使用解释器模式。
举个例子
算术表达式就是一种文法,我们可以对算术表达式进行解释。例子中没有使用Context类存储全局信息,这里直接使用了。
//抽象解释器 对应AbstractExpression
public abstract class ArithmetExpression {
//抽象的解析方法
public abstract int interpret();
}
//具体解释器:数字解释器-》目的是为了解释数字
public class NumExpression extends ArithmetExpression {
private int num;
public NumExpression(int num) {
this.num = num;
}
@Override
public int interpret() {
return num;
}
}
//抽象解释器:运算符号的抽象解释器
public class OperatorExpression extends ArithmetExpression {
//声明两个成员变量并存储运算符号两边的数字解释器
protected ArithmetExpression expression1,expression2;
public OperatorExpression(ArithmetExpression expression1, ArithmetExpression expression2) {
this.expression1 = expression1;
this.expression2 = expression2;
}
@Override
public int interpret() {
return 0;
}
}
//具体解释器:加法运算解释器
public class AdditionExpression extends OperatorExpression {
public AdditionExpression(ArithmetExpression expression1, ArithmetExpression expression2) {
super(expression1, expression2);
}
@Override
public int interpret() {
return expression1.interpret() + expression2.interpret();
}
}
使用
public static void main(String[] args) {
Calculator calculator = new Calculator("1 + 1 + 1 - 2");
System.out.println(calculator.calulate()+"");
}
总结
解释器模式可以很灵活的对文法规则进行扩展,增加相应的解释器,但是对于过于复杂的语法,会生成大量的类,后期会很难维护,所以解释器模式不适合复杂文法的实现。
网友评论