Python設計模式-直譯器模式

小屋子大俠發表於2017-06-26

Python設計模式-直譯器模式

程式碼基於3.5.2,程式碼如下;

#coding:utf-8
#直譯器模式

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、直譯器模式為文法中的每一條規則至少定義了一個類,因此包含許多規則的問法可能難以管理和維護,當文法非常複雜時,使用其他的技術如語法分析程式或編譯器生成器來解決。

相關文章