20-Python與設計模式--直譯器模式
一、模擬吉他
要開發一個自動識別譜子的吉他模擬器,達到錄入譜即可按照譜發聲的效果。除了發聲裝置外(假設已完成),最重要的就是讀譜和譯譜能力了。分析其需求,整個過程大致上分可以分為兩部分:根據規則翻譯譜的內容;根據翻譯的內容演奏。我們用一個直譯器模型來完成這個功能。
class PlayContext(): play_text = None class Expression(): def interpret(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, key, value): print "Normal Guitar Playing--Chord:%s Play Tune:%s"%(key,value)
PlayContext類為譜的內容,這裡僅含一個欄位,沒有方法。Expression即表示式,裡面僅含兩個方法,interpret負責轉譯譜,execute則負責演奏;NormGuitar類覆寫execute,以吉他 的方式演奏。
業務場景如下:
if __name__=="__main__": context = PlayContext() context.play_text = "C53231323 Em43231323 F43231323 G63231323" guitar=NormGuitar() guitar.interpret(context)
列印如下:
Normal Guitar Playing--Chord:C Play Tune:53231323
Normal Guitar Playing--Chord:Em Play Tune:43231323
Normal Guitar Playing--Chord:F Play Tune:43231323
Normal Guitar Playing--Chord:G Play Tune:63231323
二、直譯器模式
直譯器模式定義如下:給定一種語言,定義它的文法表示,並定義一個直譯器,該直譯器使用該表示來解釋語言中的句子。典型的直譯器模式中會有終結符和非終結符之說,語法也根據兩種終結符,決定語句最終含義。上例中,非終結符就是空格,終結符就是整個句尾。
三、直譯器模式的優點和應用場景
優點:
1、在語法分析的場景中,具有比較好的擴充套件性。規則修改和制訂比較靈活。
應用場景:
1、若一個問題重複發生,可以考慮使用直譯器模式。這點在資料處理和日誌處理過程中使用較多,當資料的需求方需要將資料納為己用時,必須將資料“翻譯”成本系統的資料規格;同樣的道理,日誌分析平臺也需要根據不同的日誌格式翻譯成統一的“語言”。
2、特定語法直譯器。如各種解釋型語言的直譯器,再比如自然語言中基於語法的文字分析等。
四、直譯器模式的缺點
1、解釋規則多樣化會導致直譯器的爆炸;
2、直譯器目標比較單一,行為模式比較固定,因而重要的模組中儘量不要使用直譯器模式。
一、模擬吉他
要開發一個自動識別譜子的吉他模擬器,達到錄入譜即可按照譜發聲的效果。除了發聲裝置外(假設已完成),最重要的就是讀譜和譯譜能力了。分析其需求,整個過程大致上分可以分為兩部分:根據規則翻譯譜的內容;根據翻譯的內容演奏。我們用一個直譯器模型來完成這個功能。
class PlayContext(): play_text = None class Expression(): def interpret(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, key, value): print "Normal Guitar Playing--Chord:%s Play Tune:%s"%(key,value)
PlayContext類為譜的內容,這裡僅含一個欄位,沒有方法。Expression即表示式,裡面僅含兩個方法,interpret負責轉譯譜,execute則負責演奏;NormGuitar類覆寫execute,以吉他 的方式演奏。
業務場景如下:
if __name__=="__main__": context = PlayContext() context.play_text = "C53231323 Em43231323 F43231323 G63231323" guitar=NormGuitar() guitar.interpret(context)
列印如下:
Normal Guitar Playing--Chord:C Play Tune:53231323
Normal Guitar Playing--Chord:Em Play Tune:43231323
Normal Guitar Playing--Chord:F Play Tune:43231323
Normal Guitar Playing--Chord:G Play Tune:63231323
二、直譯器模式
直譯器模式定義如下:給定一種語言,定義它的文法表示,並定義一個直譯器,該直譯器使用該表示來解釋語言中的句子。典型的直譯器模式中會有終結符和非終結符之說,語法也根據兩種終結符,決定語句最終含義。上例中,非終結符就是空格,終結符就是整個句尾。
三、直譯器模式的優點和應用場景
優點:
1、在語法分析的場景中,具有比較好的擴充套件性。規則修改和制訂比較靈活。
應用場景:
1、若一個問題重複發生,可以考慮使用直譯器模式。這點在資料處理和日誌處理過程中使用較多,當資料的需求方需要將資料納為己用時,必須將資料“翻譯”成本系統的資料規格;同樣的道理,日誌分析平臺也需要根據不同的日誌格式翻譯成統一的“語言”。
2、特定語法直譯器。如各種解釋型語言的直譯器,再比如自然語言中基於語法的文字分析等。
四、直譯器模式的缺點
1、解釋規則多樣化會導致直譯器的爆炸;
2、直譯器目標比較單一,行為模式比較固定,因而重要的模組中儘量不要使用直譯器模式。