Python設計模式-直譯器模式
程式碼基於3.5.2,程式碼如下;
class PlayContext () :
play_text = None
class Expression () :
def interpreter (self,context) :
if len(context.play_text) == 0 :
return
else :
play_segs = context.play_text.split(" " )
for play_seg in play_segs:
pos = 0
for ele in play_seg:
if ele.isalpha():
pos += 1
continue
break
play_chord = play_seg[0 :pos]
play_value = play_seg[pos:]
self.execute(play_chord,play_value)
def execute (self,play_key,play_value) :
pass
class NormGuitar (Expression) :
def execute (self,play_key,play_value) :
print("Normal Guitar Playing--Chord:{0} Play Tune:{1}" .format(play_key,play_value))
if __name__ == "__main__" :
context = PlayContext()
context.play_text = "C521312413 D123123123 H23123123 Y123231231"
guitar = NormGuitar()
guitar.interpreter(context)
直譯器模式分析與解讀
直譯器模式
直譯器模式,給定一種語言,定義它的文法表示,並定義一個直譯器,該直譯器使用該表示來解釋語言中的句子。典型的直譯器模式中會有終結符和非終結符之說,語法也根據兩種終結符,決定語句最終定義;如果一種特定型別的問題發生頻率足夠高,那麼可能就值得將該問題的各個例項表述為一個簡單語言的句子,這樣就可以構建一個直譯器,該直譯器通過解釋這些句子來解決該問題。
程式碼解讀
1、先定義了PlayContext類,該類主要實現對語句進行封裝,該例子中,主要封裝樂譜的譜子;
2、定義了Expression類,該類定義了並實現了interpreter方法,該方法主要是實現對PlayContext中封裝的語句進行語法解析,即分析樂譜中的每個樂譜;解析完成後呼叫execute方法來執行解析完成後的執行函式;
3、NormGuitar繼承自Expression類,並重寫了execute方法,具體實現語法解析完成後的執行過程。
程式碼執行結果如下:
Normal Guitar Playing--Chord:C Play Tune:521312413
Normal Guitar Playing--Chord:D Play Tune:123123123
Normal Guitar Playing--Chord:H Play Tune:23123123
Normal Guitar Playing--Chord:Y Play Tune:123231231
直譯器模式應用場景:
1、若一個問題重複發生,可以考慮使用直譯器模式,這點在資料處理和日誌處理過程中使用較多,當資料的需求方將資料儲存時,必須將資料翻譯成本系統的資料規格;
2、特定語言直譯器,如各種解釋型語言的直譯器,再比如自然語言中基於語法的文字分析。
優缺點分析
優點
1、在語法分析的場景中,具有比較好的擴充套件性,規則修改和制定比較靈活。
缺點
1、解釋規則多樣化會導致直譯器臃腫;
2、直譯器目標比較單一,行為模式比較固定,因而重要的模組中儘量不要使用直譯器模式;
3、直譯器模式為文法中的每一條規則至少定義了一個類,因此包含許多規則的問法可能難以管理和維護,當文法非常複雜時,使用其他的技術如語法分析程式或編譯器生成器來解決。