定義:給定一種語言,定義他的文法的一種表示,并定義一個解釋器,該解釋器使用該表示來解釋語言中句子。
類型:行為類模式
類圖:
http://wiki.jikexueyuan.com/project/java-design-pattern/images/interpreter-pattern-1.jpg" alt="interpreter-pattern" />
解釋器模式是一個比較少用的模式,本人之前也沒有用過這個模式。下面我們就來一起看一下解釋器模式。
解釋器模式的結(jié)構(gòu)
代碼實現(xiàn)
class Context {}
abstract class Expression {
public abstract Object interpreter(Context ctx);
}
class TerminalExpression extends Expression {
public Object interpreter(Context ctx){
return null;
}
}
class NonterminalExpression extends Expression {
public NonterminalExpression(Expression...expressions){
}
public Object interpreter(Context ctx){
return null;
}
}
public class Client {
public static void main(String[] args){
String expression = "";
char[] charArray = expression.toCharArray();
Context ctx = new Context();
Stack stack = new Stack();
for(int i=0;i
//進(jìn)行語法判斷,遞歸調(diào)用
}
Expression exp = stack.pop();
exp.interpreter(ctx);
}
}
文法遞歸的代碼部分需要根據(jù)具體的情況來實現(xiàn),因此在代碼中沒有體現(xiàn)。抽象表達(dá)式是生成語法集合的關(guān)鍵,每個非終結(jié)符表達(dá)式解釋一個最小的語法單元,然后通過遞歸的方式將這些語法單元組合成完整的文法,這就是解釋器模式。
解釋器模式的優(yōu)缺點
解釋器是一個簡單的語法分析工具,它最顯著的優(yōu)點就是擴(kuò)展性,修改語法規(guī)則只需要修改相應(yīng)的非終結(jié)符就可以了,若擴(kuò)展語法,只需要增加非終結(jié)符類就可以了。
但是,解釋器模式會引起類的膨脹,每個語法都需要產(chǎn)生一個非終結(jié)符表達(dá)式,語法規(guī)則比較復(fù)雜時,就可能產(chǎn)生大量的類文件,為維護(hù)帶來非常多的麻煩。同時,由于采用遞歸調(diào)用方法,每個非終結(jié)符表達(dá)式只關(guān)心與自己相關(guān)的表達(dá)式,每個表達(dá)式需要知道最終的結(jié)果,必須通過遞歸方式,無論是面向?qū)ο蟮恼Z言還是面向過程的語言,遞歸都是一個不推薦的方式。由于使用了大量的循環(huán)和遞歸,效率是一個不容忽視的問題。特別是用于解釋一個解析復(fù)雜、冗長的語法時,效率是難以忍受的。
解釋器模式的適用場景
在以下情況下可以使用解釋器模式:
注意事項
解釋器模式真的是一個比較少用的模式,因為對它的維護(hù)實在是太麻煩了,想象一下,一坨一坨的非終結(jié)符解釋器,假如不是事先對文法的規(guī)則了如指掌,或者是文法特別簡單,則很難讀懂它的邏輯。解釋器模式在實際的系統(tǒng)開發(fā)中使用的很少,因為他會引起效率、性能以及維護(hù)等問題。