解釋器模式java
概述 : 給定一個語言,定義它的文法表示,並定義一個解釋器,這個解釋器使用該標識來解釋語言中的句子.ide
使用場景 : 若是一種特定類型的問題發生的頻率足夠高,那麼可能就值得將該問題的各個實例表述爲一個簡單語言中的句子.這樣就能夠構建一個解釋器,該解釋器經過解釋這些句子來解決該問題.oop
解釋器模式的結構 :測試
抽象解釋器 : 聲明一個全部具體表達式都要實現的抽象接口(或者抽象類),接口中主要是一個interpret()方法,成爲解釋操做.具體解釋任務由它的各個實現類來完成,this
終結符表達式 : 實現與文法中的元素相關聯的解釋操做,一般一個解釋器模式中只有一個終結符表達式,但有多個實例,對應不一樣的終結符.終結符一半是文法中的運算單元.好比有一個簡單的公式R=R1+R2,在裏面R1和R2就是終結符,對應的解析R1和R2的解釋器就是終結符表達式.spa
非終結符表達式 : 文法中的每條規則對應於一個非終結符表達式,非終結符表達式通常是文法中的運算符或者其餘關鍵字,好比公式R=R1+R2中,」+"就是非終結符,解析」+」的解釋器就是一個非終結符表達式.非終結符表達式根據邏輯的複雜程度而增長,原則上每一個問法規則都對應一個非終結符表達式.code
環境角色 : 這個角色的任務通常是用來存放文法中各個終結符所對應的具體值,好比R=R1+R2,咱們給R1賦值1,給R2賦值2,這些信息須要存放到環境角色.接口
優勢:get
可擴展性比較好,靈活class
增長了新的解釋表達式的方式
易於實現簡單文法
缺點:
可利用場景比較小
對於複雜的文法比較難維護
解釋器模式會引發類膨脹
代碼實現
示例 : 利用解釋器完成100-(1+1)的表達式.
抽象解釋器接口
package InterpreterPattern; /** * */ public interface Interpreter { public int interpret(Context context); }
非終結表達式類(+)
package InterpreterPattern; /** * */ public class Add implements Interpreter{ @Override public int interpret(Context context) { //兩數相加 return context.getNum1() + context.getNum2(); } }
非終結表達式類(-)
package InterpreterPattern; /** * */ public class Subtract implements Interpreter { @Override public int interpret(Context context) { //兩數相減 return context.getNum1() - context.getNum2(); } }
環境角色類
package InterpreterPattern; public class Context { private int num1; private int num2; public Context(int num1,int num2){ this.setNum1(num1); this.setNum2(num2); } public int getNum1() { return num1; } public void setNum1(int num1) { this.num1 = num1; } public int getNum2() { return num2; } public void setNum2(int num2) { this.num2 = num2; } }
測試類
package InterpreterPattern; /** * Created by looper on 2017/9/7. */ public class InterpreterPatternTest { public static void main(String[] args) { //完成100 - (1+1) 算式 int result = new Subtract().interpret(new Context(100,new Add().interpret(new Context(1,1)))); System.out.println("result = "+result); } }