北風設計模式課程---解釋器模式(Interpreter Pattern)
模式動機

如果在系統中某一特定類型的問題發生的頻率很高,此時可以考慮将這些問題的執行個體表述為一個語言中的句子,是以可以建構一個解釋器,該解釋器通過解釋這些句子來解決這些問題。
解釋器模式描述了如何構成一個簡單的語言解釋器,主要應用在使用面向對象語言開發的編譯器中。
模式定義
解釋器模式(Interpreter Pattern) :定義語言的文法,并且建立一個解釋器來解釋該語言中的句子,這裡的“語言”意思是使用規定格式和文法的代碼,它是一種類行為型模式。
Interpreter Pattern: Given a language, define a representation for its grammar along with an interpreter that uses the representation to interpret sentences in the language.
Frequency of use: low
UML圖
模式結構
解釋器模式包含如下角色:
AbstractExpression: 抽象表達式
TerminalExpression: 終結符表達式
NonterminalExpression: 非終結符表達式
Context: 環境類
Client: 客戶類
模式分析
解釋器模式描述了如何為簡單的語言定義一個文法,如何在該語言中表示一個句子,以及如何解釋這些句子。
文法規則執行個體:
expression ::= value | symbol
symbol ::= expression '+' expression | expression '-' expression
value ::= an integer //一個整數值
在文法規則定義中可以使用一些符号來表示不同的含義,如使用“|”表示或,使用“{”和“}”表示組合,使用“*”表示出現0次或多次等,其中使用頻率最高的符号是表示或關系的“|” 。
抽象文法樹:
除了使用文法規則來定義一個語言,在解釋器模式中還可以通過一種稱之為抽象文法樹(Abstract Syntax Tree, AST)的圖形方式來直覺地表示語言的構成,每一棵抽象文法樹對應一個語言執行個體。
抽象文法樹描述了如何構成一個複雜的句子,通過對抽象文法樹的分析,可以識别出語言中的終結符和非終結符類。
在解釋器模式中,每一種終結符和非終結符都有一個具體類與之對應,正因為使用類來表示每一個文法規則,使得系統具有較好的擴充性和靈活性。
模式執行個體與解析
以中英文翻譯系統為例來介紹解釋器模式
體系結構
AbstractExpression接口 IExpression.cs
具體的Expression WordExpression.cs
SymbolExpression.cs
Context: 環境類 ChineseEnglishDict.cs
将各部分解釋器組合起來進行包裝,友善使用者調用 Translator.cs
Client:客戶類
模式優缺點
解釋器模式的優點
易于改變和擴充文法。
易于實作文法。
增加了新的解釋表達式的方式。
解釋器模式的缺點
對于複雜文法難以維護。
執行效率較低。
應用場景很有限。
模式适用環境
在以下情況下可以使用解釋器模式:
可以将一個需要解釋執行的語言中的句子表示為一個抽象文法樹。
一些重複出現的問題可以用一種簡單的語言來進行表達。
文法較為簡單。
效率不是關鍵問題。
【聲明與感謝】
本文,站在許多巨人的肩膀上,借鑒和引用了許多他人擁有版權的作品或著述,在此,對前人們的貢獻緻謝。并同時公布引用的内容、原作者或來源(一些來源于網際網路的内容本人無法追述本源,深表遺憾)。
【參考文獻】
《設計模式—可複用面向對象軟體的基礎》作者: [美] Erich Gamma / Richard Helm / Ralph Johnson / John Vlissides 譯者: 李英軍 / 馬曉星 / 蔡敏 / 劉建中 等 機械工業出版社
《重構—改善既有代碼的設計》作者: Martin Fowler譯者:候捷 中國電力出版社
《靈活軟體開發—原則、模式與實踐》作者: Robert C. Martin 清華大學出版社
《程式員修煉之道—從小工到專家》作者: Andrew Hunt / David Thomas 電子工業出版社
《Head First 設計模式》作者: 弗裡曼 譯者: O'Reilly Taiwan公司 中國電力出版社
《設計模式之禅》 作者: 秦小波 機械工業出版社
MSDN WebCast 《C#面向對象設計模式縱橫談》 講師:李建忠
劉偉. 設計模式. 北京:清華大學出版社, 2011.
劉偉. 設計模式實訓教程. 北京:清華大學出版社, 2012.
《大話設計模式》 作者: 程傑 清華大學出版社
《C#圖解教程》作者: 索利斯 譯者: 蘇林 / 朱晔 人民郵電出版社
《你必須知道的.NET》作者: 王濤
《項目中的.NET》作者: 李天平 電子工業出版社
《Microsoft .NET企業級應用架構設計》作者: (美)埃斯波西托等編著 譯者: 陳黎夫