大話設計模式 —— 第二十七章《解釋器模式》

 


定義


解釋器模式是一種類行爲型模式,定義爲: 

  • 給定一門語言,定義它的文法的一種表示,並定義一個解釋器,該解釋器使用該表示來解釋語言中的句子。

簡單地說,解釋器就相當於翻譯器一樣,將一種語言解釋爲另一種語言。該模式使用的場景比較少,一般而言,該模式對於我們開發人員來說,基本上都用不到。除非你想自己開發一種語言。解釋器模式真正開發起來很難,就相當於自己開發了一種語言給別人用。

  • 抽象解釋器(AbstractExpression):聲明一個所有具體表達式都要實現的抽象接口(或者抽象類),接口中主要是一個interpret()方法,稱爲解釋操作。具體解釋任務由它的各個實現類來完成,具體的解釋器分別由終結符解釋器TerminalExpression和非終結符解釋器NonterminalExpression完成。
  • 終結符表達式(TerminalExpression):實現與文法中的元素相關聯的解釋操作,通常一個解釋器模式中只有一個終結符表達式,但有多個實例,對應不同的終結符。終結符一半是文法中的運算單元,比如有一個簡單的公式R=R1+R2,在裏面R1和R2就是終結符,對應的解析R1和R2的解釋器就是終結符表達式。                                
  • 非終結符表達式(NonterminalExpression):文法中的每條規則對應於一個非終結符表達式,非終結符表達式一般是文法中的運算符或者其他關鍵字,比如公式R=R1+R2中,+就是非終結符,解析+的解釋器就是一個非終結符表達式。非終結符表達式根據邏輯的複雜程度而增加,原則上每個文法規則都對應一個非終結符表達式。
  • 環境角色(Context):這個角色的任務一般是用來存放文法中各個終結符所對應的具體值,比如R=R1+R2,我們給R1賦值100,給R2賦值200。這些信息需要存放到環境角色中,很多情況下我們使用Map來充當環境角色就足夠了。

因爲解釋器 模式在實際中一般用不到, 所以該模式就不用代碼實現了。


優點


 

  • 擴展性好。由於在解釋器模式中使用類來表示語言的文法規則,因此可以通過繼承等機制來改變或擴展文法。
  • 容易實現。在語法樹中的每個表達式節點類都是相似的,所以實現其文法較爲容易。

缺點


  • 執行效率較低。解釋器模式中通常使用大量的循環和遞歸調用,當要解釋的句子較複雜時,其運行速度很慢,且代碼的調試過程也比較麻煩。
  • 會引起類膨脹。解釋器模式中的每條規則至少需要定義一個類,當包含的文法規則很多時,類的個數將急劇增加,導致系統難以管理與維護。
  • 可應用的場景比較少。在軟件開發中,需要定義語言文法的應用實例非常少,所以這種模式很少被使用到。

應用場景


  • 當問題重複出現,且可以用一種簡單的語言來進行表達時。
  • 當一個語言需要解釋執行,並且語言中的句子可以表示爲一個抽象語法樹的時候,如 XML 文檔解釋。

 

發佈了209 篇原創文章 · 獲贊 73 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章