很少会用到的一种行为模式,提供了一种解释语言的语法或表达的方式。
给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。
使用场景:
1.对于一些固定文法构建一个解释句子的解释器。
2.在某些特定的领域出现不断重复的问题,可以将该领域的问题转化为一种语法规则下的语句,然后构建解释器来解释该语句。
优点:
将复杂的问题简单化、模块化,分离实现、解释执行。
灵活的扩展性。
缺点:
会生成大量的类,导致后期维护困难。
复杂的文法比较难维护
解释器模式采用递归调用方法
使用的场景较少
package 解释器模式;
public class Client {
public static void main(String[] args) {
Calculator a = new Calculator("1 + 221 - 3 + 1");
System.out.println(a.calculate());
}
}
package 解释器模式;
public abstract class ArithmeticExpression{
public abstract int interpret() ;
}
package 解释器模式;
public class NumExpression extends ArithmeticExpression {
private int num;
public NumExpression(int num) {
this.num = num;
}
@Override
public int interpret() {
// TODO Auto-generated method stub
return num;
}
}
package 解释器模式;
public abstract class OperatorExpression extends ArithmeticExpression {
protected ArithmeticExpression exp1,exp2;
public OperatorExpression(ArithmeticExpression exp1, ArithmeticExpression exp2) {
this.exp1 = exp1;
this.exp2 = exp2;
}
}
package 解释器模式;
public class AdditionExpression extends OperatorExpression {
public AdditionExpression(ArithmeticExpression exp1, ArithmeticExpression exp2) {
super(exp1, exp2);
// TODO Auto-generated constructor stub
}
@Override
public int interpret() {
// TODO Auto-generated method stub
return exp1.interpret() + exp2.interpret();
}
}
package 解释器模式;
public class SubtractionExpression extends OperatorExpression {
public SubtractionExpression(ArithmeticExpression exp1, ArithmeticExpression exp2) {
super(exp1, exp2);
// TODO Auto-generated constructor stub
}
@Override
public int interpret() {
// TODO Auto-generated method stub
return exp1.interpret() - exp2.interpret();
}
}
package 解释器模式;
import java.lang.reflect.Array;
import java.util.Iterator;
import java.util.Stack;
public class Calculator {
private Stack<ArithmeticExpression> mExpStack = new Stack<ArithmeticExpression>();
public Calculator(String expression){
ArithmeticExpression exp1;
ArithmeticExpression exp2;
String[] elements = expression.split(" ");
System.out.println("elements length "+ elements.length);
for(int i = 0 ; i < elements.length; i++){
System.out.println(" "+elements[i].charAt(0));
switch(elements[i].charAt(0)){
case '+':
exp1 = mExpStack.pop();
exp2 = new NumExpression(Integer.valueOf(elements[++i]));
System.out.println("exp1 "+exp1.interpret() + " exp2 "+ exp2.interpret());
mExpStack.push(new AdditionExpression(exp1, exp2));
break;
case '-':
exp1 = mExpStack.pop();
exp2 = new NumExpression(Integer.valueOf(elements[++i]));
System.out.println("exp1 "+exp1.interpret() + " exp2 "+ exp2.interpret());
mExpStack.push(new SubtractionExpression(exp1, exp2));
break;
default:
mExpStack.push(new NumExpression(Integer.valueOf(elements[i])));
}
}
}
public int calculate(){
return mExpStack.pop().interpret();
}
}