設計模式GOF23——解釋器模式

解釋器模式(Interpreter),是一種行爲性模型,行爲型模式關注的是系統中對象之間的相互交互,解決系統在運行時對象之間的相互通信和協作,進一步明確對象的職責。相比來說,創建型模式關注對象的創建過程,結構型模式關注對象和類的組合關係。

模式的職責

模式用於描述如果構成一個簡單的語言解釋器,主要用於使用面嚮對象語言開發的編譯器和解釋器設計。
當我們需要開發一種新的語言時,可以考慮使用解釋器模式。
儘量不要使用解釋器模式,後期維護會有很大麻煩。在項目中,可以使用Jruby,Groovy、Java的js引擎來替代解釋器的作用,彌補java語言的不足。
基於上述,這是一個不常用的設計模式。

引入概念的解釋

終結符:表示一段文字的要結束的符號。

模式的角色

抽象解釋器:抽象解釋器的公共方法
終結符解釋器:表示這段要結束的字段的字符解釋類。
非終結符解釋器:並沒有表示這段要結束的字段的字符的解釋類。
文本環境:用來存放一些解釋過程中需要存儲的參數

模式的實現

//抽象解釋器:抽象解釋器的必須方法
public interface Expression {  
    public int interpret(Context context);  
}  
//具體解釋器(加法)
public class Plus implements Expression {  
    //加法解釋器的實現
    @Override  
    public int interpret(Context context) {  
        return context.getNum1()+context.getNum2();  
    }  
} 
//具體解釋器(減法)
public class Minus implements Expression {  
    //減法解釋器的實現
    @Override  
    public int interpret(Context context) {  
        return context.getNum1()-context.getNum2();  
    }  
}  
//文本環境
public class Context {  
    //用來存儲兩個用來計算的數
    private int num1;  
    private int num2;  

    public Context(int num1, int num2) {  
        this.num1 = num1;  
        this.num2 = 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;  
    }  


}  
客戶端調用
public class Client {  

    public static void main(String[] args) {  

        // 調用過程這裏的實現方法其實很粗糙
        int result = new Minus().interpret((new Context(new Plus()  
                .interpret(new Context(9, 2)), 8)));  
        System.out.println(result);  
    }  
} 

其實解釋器的結果並不一定是某種值的結果,一般是“翻譯”過後的語言的表現,而不是一個具體的值。

開發中常見的場景

EL表達式的處理
正則表達式解釋器
Sql語法的解釋器
數學表達式解釋器

建議

即使遇到上述情況,都有一些開源的包可以調用。儘量不要因爲使用重複造輪子(當然如果是學習的話試着造輪子也許是成長最快的方法之一)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章