解釋器模式(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語法的解釋器
數學表達式解釋器
建議
即使遇到上述情況,都有一些開源的包可以調用。儘量不要因爲使用重複造輪子(當然如果是學習的話試着造輪子也許是成長最快的方法之一)。