1类图
2定义:
2.1 给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
3使用场景
3.1 如果某个简单的语言需要解释执行并且可以将语言中的语句表示为一个抽象语法树时可以考虑使用解释器模式。
3.2 在某些特定的领域出现不断重复的问题时,可以将该领域的问题转化为一种语法规则下的语句,然后构建解释器来解释该语句。
4抽象的解释器
public abstract class ArithmeticExpression {
public abstract int interpret();
}
5数字解释器
public class NumExpression extends ArithmeticExpression {
private int num;
public NumExpression(int num){
this.num = num;
}
@Override
public int interpret() {
return num;
}
}
6运算符号抽象解释器
public abstract class OperatorExpression extends ArithmeticExpression {
protected ArithmeticExpression exp1,exp2;
public OperatorExpression(ArithmeticExpression exp1,ArithmeticExpression exp2){
this.exp1 = exp1;
this.exp2 = exp2;
}
}
7加法运算抽象解释器
public class additionExpression extends OperatorExpression {
public additionExpression(ArithmeticExpression exp1, ArithmeticExpression exp2) {
super(exp1, exp2);
}
@Override
public int interpret() {
return exp1.interpret() + exp2.interpret();
}
}
8处理与解释相关业务逻辑
public class Calculator {
private Stack<ArithmeticExpression> mExpeStack = new Stack<>();
public Calculator(String expression) {
ArithmeticExpression exp1,exp2;
String[] element = expression.split(" +");
for(int i = 0; i < element.length; i++){
switch(element[i].charAt(0)){
case '+':
exp1 = mExpeStack.pop();
exp2 = new NumExpression(Integer.valueOf(element[++i]));
mExpeStack.push(new additionExpression(exp1, exp2));
break;
default:
mExpeStack.push(new NumExpression(Integer.valueOf(element[i])));
break;
}
}
}
public int calculate(){
return mExpeStack.pop().interpret();
}
}
9客户端
public class Client {
public static void main(String[] args) {
Calculator c = new Calculator("153 + 3589 + 118 + 555");
System.out.println(c.calculate());
System.out.println(153 + 3589 + 118 + 555);
}
}