Python與設計模式 直譯器模式

2021-09-14 08:14:40 字數 2018 閱讀 6966

要開發乙個自動識別譜子的結他模擬器,達到錄入譜即可按照譜發聲的效果。除了發聲裝置外(假設已完成),最重要的就是讀譜和譯譜能力了。分析其需求,整個過程大致上分可以分為兩部分:根據規則翻譯譜的內容;根據翻譯的內容演奏。我們用乙個直譯器模型來完成這個功能。

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、直譯器目標比較單一,行為模式比較固定,因而重要的模組中盡量不要使用直譯器模式。

20 Python與設計模式 直譯器模式

要開發乙個自動識別譜子的結他模擬器,達到錄入譜即可按照譜發聲的效果。除了發聲裝置外 假設已完成 最重要的就是讀譜和譯譜能力了。分析其需求,整個過程大致上分可以分為兩部分 根據規則翻譯譜的內容 根據翻譯的內容演奏。我們用乙個直譯器模型來完成這個功能。class playcontext play tex...

python設計模式(十三) 直譯器模式

此前已經將創造型模式 結構性模式分享了,後面將分享模式設計中的另一種典型模式 行為型模式。創造型模式是解決實體的生成問題 結構性模式是為了解決實體的組合 搭配問題 而行為型設計模式的出現是為了解決不同實體通訊的問題。直譯器模式 開發者自定義一種 有內涵 的語言 或者叫字串 並設定相關的解釋規則,輸入...

python設計模式(十三) 直譯器模式

此前已經將創造型模式 結構性模式分享了,後面將分享模式設計中的另一種典型模式 行為型模式。創造型模式是解決實體的生成問題 結構性模式是為了解決實體的組合 搭配問題 而行為型設計模式的出現是為了解決不同實體通訊的問題。直譯器模式 開發者自定義一種 有內涵 的語言 或者叫字串 並設定相關的解釋規則,輸入...