本文源碼:GitHub·點這裡 || GitEE·點這裡
解釋器模式是對象的行為模式。給定一個語言之後,解釋器模式可以定義出其文法的一種表示,并同時提供一個解釋器。用戶端可以使用這個解釋器來解釋這個語言中的表達式。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLxkDO2gTOzQDMy0iM4gjNwEDNxIzNxATM5EDMy0yNxcTM5YTMvwFMxkTMwIzLcdTM3ETO2EzLcd2bsJ2Lc12bj5ycn9Gbi52YugTMwIzZtl2Lc9CX6MHc0RHaiojIsJye.png)
(1)、抽象表達式
Express:聲明具體表達式角色需要實作的抽象接口,該接口主要提供一個interpret()方法,稱做解釋操作。
(2)、終結符表達式
TerminalExpress:實作抽象表達式角色接口,主要是一個interpret()方法;每個終結符都有一個具體終結表達式與之相對應。比如解析c=a+b,a和b是終結符,解析a和b的解釋器就是終結符表達式。
(3)、非終結符表達式
NotTerminalExpress:每一條規則都需要一個具體的非終結符表達式用來銜接,一般是指運算符或者邏輯判斷,比如c=a+b,“+"就是非終結符,解析“+”的解釋器就是一個非終結符表達式。
(4)、環境容器
DataMap:一般是用來存放各個終結符所對應的具體值,比如c=a+b轉換為c=1+2。這些資訊需要一個存放環境。
類圖結構
源碼實作
(1)Expression結構
表達式接口:具有不同的實作類。
核心方法:
(2)SpelExpressionParser結構
(3)ExpressionParser接口
(4)Expression擷取
根據不同的條件擷取不同的Expression對象。這裡産生類的依賴關系。
源碼位置:TemplateAwareExpressionParser
場景
編譯器、運算符表達式、正規表達式、機器人等。
優點
當有一個表達式或者語言需要解釋執行,該場景下的内容可以考慮使用解釋器模式,使程式具有良好的擴充性。
缺點
解釋器模式會引起類膨脹,會導緻程式執行和調試非常複雜,不容易了解。