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);
}
}