解釋器模式是行爲型模式的一種。給定一個語言(如由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