說實話,這種設計模式太抽象了,使用場景也比較少,基本上也不會用到,大家先來基本了解下就行了。
解釋器模式提供了一種解釋語言的語法或表達式方法。
舉個例子我們要輸出 a開頭,c結尾,中間是任意個b的字符串。
于是我們定義
S::=aA*c
A::=b
::=表示推導,*表示可以有0到N個重復
描述這個集合的文法,稱為形式文法。
描述得是形式語言,定義的是形式文法。
使用場景
1.如果某個的簡單的而語言需要解釋執行,且可以將該語言中的語句表示為一個抽象語法樹。
比如加減運算p+q+m-n可以表示為:
2.在某些特定的領域出現不斷重復的問題時,可以將該領域的問題轉化為一種語法規則下的語句,然后構建解釋起來解釋該語句。比如字符串的大小寫轉化,阿拉伯數字轉化為中文的數字等。
實戰:
表達式m+n+p我們來進行解釋。
注意:“+”是非終結符號,m、n、p是非終結符號。
首先定一個抽象算術運算解釋器ArithmeticExpression,里面有一個抽象的解釋方法interpreter,返回具體解析到的值。
兩個具體子類實現它:
1.數字解釋器NumExpression,狗仔函數傳入num=傳入的數字,interpreter返回num;
2.加法運算解釋器,構造函數傳入了兩個ArithmeticExpression類型解釋器對象,保存為成員變量exp1、exp2,其實也就是保存了+兩邊的數字解釋器。
最后interpreter方法進行運算,并且返回運算結果。
return exp1.interpreter() + exp2.interpreter();
我們的解釋器就實現完成了
使用:
把m + n + p注意中間帶有空格用來splite每一個字符得到數組elems[]; 遍歷數組,如果遇到數字就創建Num解釋器,并且壓入棧,如果遇到符號就把上一個棧彈出來,并且把下一個字符也生成Num解釋器,作為兩個參數創建AdditionExpression解釋器,然后把運算解釋器壓入棧。
最后調用棧.pop().interpreter();就能得到結果
Android中的實現
Android中使用解釋器模式太少了,有一個地方,我們在AndroidMaifext.xml里面定義的配置項,就是PackagePaser的parsePackage方法來翻譯解釋的。
優點:靈活的擴展性,需要擴展的時候,增加非終結符解釋器即可。
缺點:每條文法都有一個解釋器,類太多,后期維護困難,且如果文法復雜,構建抽象語法樹會異常繁瑣。