06-08-設計模式 直譯器模式
四則運算問題
通過直譯器模式來實現四則運算,如計算a+b-c的值,具體要求
1)先輸入表示式的形式,比如a+b+c-d+e,要求表示式的字母不能重複
2)在分別輸入a,b,c,d,e的值
3)最後求出結果:如圖
傳統方案解決四則運算問題分析
1)編寫一個方法,接收表示式的形式,然後根據使用者輸入的數值進行解析,得到結果
2)問題分析:如果加入新的運算子,比如*/(等等,不利於擴充套件,另外讓一個方法來解析會造成程式結構混亂,不夠清晰.
3)解決方案:可以考慮使用直譯器模式,即:表示式->直譯器(可以有多種)->結果
直譯器模式
基本介紹
1)在編譯原理中,一個算術表示式通過詞法分析器形成詞法單元,而後這些詞法單元再通過語法分析器構建語法分析樹,最終形成一顆抽象的語法分析樹。這裡的詞法分析器和語法分析器都可以看做是直譯器
2)直譯器模式(InterpreterPattern):是指給定一個語言(表示式),定義它的文法的一種表示,並定義一個直譯器,使用該直譯器來解釋語言中的句子(表示式)
3)應用場景
-應用可以將一個需要解釋執行的語言中的句子表示為一個抽象語法樹
-一些重複出現的問題可以用一種簡單的語言來表達
-一個簡單語法需要解釋的場景
4)這樣的例子還有,比如編譯器、運算表示式計算、正則表示式、機器人等
類圖
對原理類圖的說明-即(直譯器模式的角色及職責)
1)Context:是環境角色,含有直譯器之外的全域性資訊.
2)AbstractExpression:抽象表示式,宣告一個抽象的解釋操作,這個方法為抽象語法樹中所有的節點所共享
3)TerminalExpression:為終結符表示式,實現與文法中的終結符相關的解釋操作
4)NonTermialExpression:為非終結符表示式,為文法中的非終結符實現解釋操作.
5)說明:輸入ContextheTerminalExpression資訊通過Client輸入即可
直譯器模式解決
類圖
原始碼剖析
Spring原始碼
Spring框架中SpelExpressionParser就使用到直譯器模式
直譯器模式的注意事項和細節
1)當有一個語言需要解釋執行,可將該語言中的句子表示為一個抽象語法樹,就可以考慮使用直譯器模式,讓程式具有良好的擴充套件性
2)應用場景:編譯器、運算表示式計算、正則表示式、機器人等
3)使用直譯器可能帶來的問題:直譯器模式會引起類膨脹、直譯器模式採用遞迴呼叫方法,將會導致除錯非常複雜、效率可能降低.