解釋器模式

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);
        // TODO Auto-generated constructor stub
    }

    @Override
    public int interpret() {
        // TODO Auto-generated method stub
        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);
    }
}
發佈了51 篇原創文章 · 獲贊 12 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章