設計模式-解釋器模式(Interpreter)

解釋器模式是行爲型模式的一種。給定一個語言(如由abcdef六個字符組成的字符串集合),定義它的文法的一種表示(S::=abA*ef,A::=cd)並定義一個解釋器,解釋器使用該表示來解釋語言中的句子.其中的解釋器相似一個翻譯機java

 

角色和職責:git

1.抽象解釋器(AbstractExpression):github

   維護對行爲實現(Implementor)的引用express

2.終結符解釋器(TerminalExpression) -AddExpression:ide

 

3.非終結符解釋器(NonterminalExpression)-NumberExpression:this

 

4.上下文環境(Context):spa

 

UML圖:翻譯

具體代碼:code

/**
 * 抽象解釋器
 */
public interface AbstractExpression {
    int interptet();//處理
}
/**
 * 數字類
 */
public class NumberExpression implements AbstractExpression{
    private int number;
    public NumberExpression(int number){
        this.number = number;
    }

    @Override
    public int interptet() {
        return number;
    }
}
/**
 * 運算類
 */
public class AddExpression implements AbstractExpression{
    private AbstractExpression expression1;
    private AbstractExpression expression2;
    public AddExpression(AbstractExpression expression1,AbstractExpression expression2){
        this.expression1 = expression1;
        this.expression2 = expression2;
    }

    @Override
    public int interptet() {
        return expression1.interptet() + expression2.interptet();
    }
}
import java.util.Stack;

/**
 * 上下文,解釋器
 *
 */
public class Context {
    Stack<AbstractExpression> stack = new Stack<AbstractExpression>();
    public Context(String str){
        String strs[] = str.split(" ");
        for(int i=0;i<strs.length;i++){
            switch (strs[i]){
                case "+":
                    AbstractExpression number1 = stack.pop();
                    AbstractExpression number2 = new NumberExpression(Integer.parseInt(strs[++i]));
                    stack.push(new AddExpression(number1,number2));
                    break;
                default:
                    stack.push(new NumberExpression(Integer.parseInt(strs[i])));
                    break;
            }
        }
    }

    public int calculate(){
        return stack.pop().interptet();//計算結果
    }
}
public class Main {
    public static void main(String[] args) {
        Context context = new Context("22 + 33 + 44");
        int result = context.calculate();//計算結果
        System.out.println("計算結果:"+result);
    }
}

結果:對象

計算結果:99

 

優缺點:

優:靈活性強,如上邊的例子,當咱們想對文法規則進行擴展延伸時,只須要增長相應的非終結符解釋器,並在構建語法樹的時候使用新增的解釋器對象進行具體的解釋便可.

缺:由於每一條文法均可以對應至少一個解釋器,會生成大量的類,致使後期維護困難,並且對應複雜的文法,構建語法樹會顯得異常繁瑣.

 

源碼地址:https://github.com/qjm201000/design_pattern_interpreter.git

相關文章
相關標籤/搜索