直譯器模式(interpreter pattern) 是指給定一門語言, 定義它的語法的一種表示, 並定義乙個直譯器,該直譯器使用該表示來解釋語言中的句子。是一種按照規定的語法進行解析的模式,屬於行為型模式。
就比如編譯器可以將原始碼編譯解釋為機器碼, 讓cpu能進行識別並執行。直譯器模式的作用其實與編譯器一樣,都是將一些固定的語法進行解釋,構建出乙個解釋句子的直譯器。簡單理解,直譯器是乙個簡單語法分析工具,它可以識別句子語義,分離終結符號和非
終結符號,提取出需要的資訊,讓我們能針對不同的資訊做出相應的處理。其核心思想是識別語法,構建解釋。
其實我們每天都生活在直譯器模式中,我們平時所聽到的**都可以通過簡譜記錄下來;還有戰爭年代發明的摩爾斯電碼(又譯為摩斯密碼, morsecode) , 其實也是一種直譯器。我們的程式中,如果存在一種特定型別的問題,該型別問題涉及多個不同例項,但是具備固定語法描述,那麼可以使用直譯器模式對該型別問題進行解釋,分離出需要的資訊,根據獲取的資訊做出相應的處理。簡而言之,對於一些固定語法構建乙個解釋句子的直譯器。直譯器模式適用於以下應用場景:
抽象表示式(expression) :負責定義乙個解釋方法interpret, 交由具體子類進行具體解釋;
終結符表示式(terminal expression) :實現文法中與終結符有關的解釋操作。文法中的每乙個終結符都有乙個具體終結表示式與之相對應,比如公式r=r1+r2,r1和r2就是終結符,對應的解析r1和r2的直譯器就是終結符表示式。通常乙個直譯器模式中只有乙個終結符表示式,但有多個例項,對應不同的終結符(r1,r2);
非終結符表示式(nonterminal expression) :實現文法中與非終結符有關的解釋操作。文法中的每條規則都對應於乙個非終結符表示式。非終結符表示式一般是文法中的運算子或者其他關鍵字,比如公式r=r1+r2中, 「+」就是非終結符,解析「+」的直譯器就是乙個非終結符表示式。非終結符表示式根據邏輯的複雜程度而增加,原則上每個文法規則都對應乙個非終結符表示式;
上下文環境類(context) :包含直譯器之外的全域性資訊。它的任務一般是用來存放文法中各個終結符所對應的具體值,比如r=r1+r2,給r1賦值100,給r2賦值200,這些資訊需要存放到環境中。
下面我們用直譯器模式來實現乙個數學表示式計算器,包含加減乘除運算。首先定義抽象表示式角色iarithmeticinterpreter介面:
publicinte***ce
iarithmeticinterpreter
建立終結表示式角色abstractinterpreter抽象類:
publicabstract
class
abstractinterpreter implements iarithmeticinterpreter
}
分別建立非終結表示式角色加、減、乘、除直譯器:
//加public
class
addinterpreter extends abstractinterpreter
public
intinterpret() }//
減public
class
subinterpreter extends abstractinterpreter
public
intinterpret() }//
乘public
class
multiinterpreter extends abstractinterpreter
public
intinterpret() }//
除public
class
divinterpreter extends abstractinterpreter
public
intinterpret()
}
建立數字表示式類:
publicclass
numinterpreter implements iarithmeticinterpreter
public
intinterpret()
}
建立計算器類:不在乎乘除與加減得順序,這都是直譯器按照語義得解釋,本案例中按照順序執行
publicclass
calculator
private
void
parse(string expression)
else}}
public
intcalculate()
}
操作工具類:
publicclass
operatorutil
public
static
abstractinterpreter getinterpreter(iarithmeticinterpreter left, iarithmeticinterpreter right, string symbol)
else
if (symbol.equals("-"
))
else
if (symbol.equals("*"
))
else
if (symbol.equals("/"
))
return
null
; }
}
測試類:
publicclass
test
}
優點:
缺點:
設計模式之直譯器模式
直譯器模式是一種類行為型模式,它主要是用來解釋特定語言的特定文法表示,雖然這個在實際生產中不常用到,但是我們學習一下還是有幫助的。定義 給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。使用場景 當有乙個語言需要解釋執行,並且你可將該語言中的句子表示為乙...
設計模式之直譯器模式
直譯器模式 1.直譯器模式 給定乙個語言,定義它文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。如果一種特定型別的問題發生的頻率足夠高,那麼可能就值得將該問題的各個例項表述為乙個簡單語言中的句子。這樣就可以構建乙個直譯器,該直譯器通過解釋這些句子來解決該問題。比如 在字串中...
設計模式之直譯器模式
解析器模式是一種行為型設計模式。其思想是 給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,該直譯器使用該表示來解釋語言中的句子。解析器模式涉及4個角色 結構圖 於網路 下面提供乙個簡單例子。乙個簡易的控制台計算器,要求使用者輸入乙個表示式,如a b c,然後要求使用者輸入每個變數的具體值,如...