概述
在軟體構建過程中,如果某一特定領域的問題比較複雜,類似的模式不斷重複出現,如果使用普通的程式設計方式來實現將面臨非常頻繁的變化。在這種情況下,將特定領域的問題表達為某種語法規則下的句子,然後構建乙個直譯器來解釋這樣的句子,從而達到解決問題的目的。
意圖
給定乙個語言,定義它的文法的一種表示,並定義一種直譯器,這個直譯器使用該表示來解釋語言中的句子。
結構圖
實現要點
1.interpreter模式的應用場合是interpreter模式應用中的難點,只有滿足「業務規則頻繁變化,且類似的模式不斷重複出現,並且容易抽象為語法規則
的問題」才適合使用interpreter模式。
2.使用interpreter模式來表示文法規則,從而可以使用物件導向技巧來方便地「擴充套件」文法。
3.interpreter模式比較適合簡單的文法表示,對於複雜的文法表示,interperter模式會產生比較大的類層次結構,需要求助於語法分析生成器這樣的標準工具。
適用性
1.interpreter模式的應用場合是interpreter模式應用中的難點,只有滿足「業務規則頻繁變化,且類似的模式不斷重複出現,並且容易抽象為語法規則的問題」才適合使用interpreter模式。
總結
效率不是乙個interpreter關心的關鍵問題。最高效的直譯器通常不是通過直接解釋語法分析樹實現的,而是首先將它們轉換成另一種形式。例如:正規表示式通常被轉換成狀態機。但即使在這種情況下,如果效率不是乙個關鍵問題,轉換器仍可用interpreter模式實現,該模式仍是有用的。
角色說明:
abstractexpression:
- 宣告乙個抽象的interpret方法,抽象語法樹中所有的節點都必須實現該抽象方法。
terminalexpression:
- 實現和語法中末端符號相關的interpret方法。
- 在每個句子的末端符號中均需要乙個terminalexpression例項。
nonterminalexpression:
另外乙個實現了abstractexpression 介面的類,用來處理語法樹中非末端節點的語法。它含有下乙個abstractexpression(s)的引用,呼叫它每個子節點的interpret方法。
context:
interpreter方法所需要的資訊的容器,該資訊對interpreter而言全域性可見。充當幾個abstractexpresssion 例項之間的通訊頻道。
patternclient:
構建或者接收乙個抽象語法書的例項。對於乙個特定的句子而言,語法樹往往由若干個terminalexpressions 和 nonterminalexpression組成。patterclient在合適的context下,呼叫interpret方法。
生活中的例子
在日常生活中英漢辭典的作用就是把中文翻譯成英文或者是把英文翻譯成中文,它的實現原理就是詞典庫里先把對應的中文和英文存在資料庫表裡,然後根據你輸入的內容來匹配出相應的結果出來.
示例用例圖
在公司裡,借款單申請需要高管來審批,而高管又不會上班時間都坐在電腦面前,公司就有個系統,員工的借款申請都會通過手機簡訊方式來提示高管,高管可以通過回覆簡訊來審批單據,高管一般都很懶,不願回覆太多的字,只能回覆y或y來表示同意,n或n表示拒絕,用四位標識碼代替借款申請單號,用例圖如下:
直譯器模式
include include include include include using namespace std 直譯器模式 給定一種語言,定義它的文法的一種表示,並定義乙個直譯器 該直譯器使用該表示來解釋語言中的句子 類似於程式語言或者指令碼 假設情景是乙個指令碼控制系統 wasd上下左右方...
直譯器模式
1 模式定義 直譯器模式 interpreter pattern 定義語言的文法,並且建立乙個直譯器來解釋該語言中的句子,這裡的 語言 意思是使用規定格式和語法的 它是一種類行為型模式。2 模式結構 直譯器模式包含如下角色 abstractexpression 抽象表示式 terminalexpre...
直譯器模式
給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。要解決的問題 如果一種特定型別的問題發生的頻率足夠高,那麼可能就值得將該問題的各個例項表述為乙個簡單語言中的句子。這樣就可以構造乙個直譯器,該直譯器通過解釋這些句子來解決該問題。的好處 當有乙個語言需要解...