直譯器模式(interpreter pattern)是一種按照規定語法進行解析的方案,例如解析四則運算、sql語句等,現在專案中使用較少,其定義如下:
給定一門語言,定義它的文法的一種表示,並定義乙個直譯器,該直譯器使用該表示來解釋語言中的句子。
1. abstractexpression 抽象直譯器
具體解釋任務由具體實現類完成。
public abstract class abstractexpression
2. terminalexpression 終結符表示式
例如a + b
中的a
和b
,這些運算元素除了需要賦值外,不需要做任何處理,功能也基本相同,是語法中的最小單元,相當於組合模式中的葉子。
public class terminalexpression extends abstractexpression
}
3. nonterminalexpression 非終結符表示式
例如a + b
中的+
號,這些運算符號都會對應乙個具體的業務邏輯,例如加減乘除就是四個不同的非終結符表示式,相當於組合模式中的樹枝。
public class nonterminalexpression extends abstractexpression
public void interpret(context ctx)
}
4. context 環境角色
儲存各個直譯器需要使用到的資料,或是公共功能。
public class context
5. client 客戶端角色
使用直譯器的客戶端,通常在這裡去把按照語言的語法做的表示式,轉換成為使用直譯器物件描述的抽象語法樹,然後呼叫解釋操作。
public class client
容易修改(修改相應非終結符表示式)或擴充套件(新增相應非終結符表示式)語法。
引起類的膨脹,每乙個語法都要產生乙個非終結符表示式,語法複雜時將會產生大量類檔案。
迴圈的遞迴呼叫,帶來的效能問題不容忽視,且難以除錯。
重**生的問題
例如多個伺服器產生的大量日誌,需要對日誌進行分類處理,檔案格式可能不同但是資料要素都是一樣的,按照直譯器的說法就是終結符表示式都是一樣的,不過非終結符表示式需要制定。
一些簡單或者標準的語法需要解釋的場景
例如 sql 語法分析,金融中大量的運算等。不過這些部分也逐漸被專門工具所替代了。
資料分析工具、報表設計工具、科學計算工具等
盡量不要找重要的模組使用直譯器模式,否則維護會是乙個很大的問題。可以選擇使用shell
、jruby
、groovy
等指令碼語言來替代直譯器模式。
對效率要求不高的場景(例如可以在晚間執行),因為直譯器模式的效能並不高。
準備使用直譯器模式時,可以考慮一下expression4j
、mesp
(math expression string parser)、jep
等開源的解析工具包。它們功能強大,且容易使用,效率也還不錯,沒必要自己從頭開始編寫(使用別人寫好的工具也是乙個很好的選擇)。
設計模式分類以及六大設計原則
(二十三)直譯器模式
定義 直譯器模式 interpreter 給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。interpreter.cpp 定義控制台應用程式的入口點。include stdafx.h include include using namespace st...
設計模式《二十三》 迭代器模式
提供一種方法順序訪問乙個聚合物件中各個元素,而又無須暴露該物件的內部表示。可以使用不同的方式來遍歷整個整合物件。iterator 抽象迭代,定義訪問和遍歷元素的介面,一般都是固定介面 first,next,isdone last concreteiterator 具體迭代器,實現迭代器介面,完成容器...
python二十三 裝飾器
import time 裝飾器的架子 def timer func start time time.time func stop time time.time print 函式執行時間 s stop time start time def test time.sleep 2 print 函式執行完畢...