什麼是解譯器模式?
解譯器設計模式用於分析一個實體的關鍵元素,並且針對每個元素都提供自己的解釋或相應的動作。
解譯器模式問題與解決方案
解譯器設計模式是我們經常使用但未意識到的少數幾個常見設計模式之一。並未限制這種設計模式只用於類的建立。在建立大多數編程演算法的過程中,我們都會使用到解譯器設計模式的基本概念。
為了理解解譯器設計模式的工作原理,我們以宏語言的處理為例。為每個宏編寫的命令本身是更多命令的集合。簡化的宏語言使編程人員不必考慮其他系統命令的文法就能夠更容易的完成建立操作。在某些情況下,這也能提升安全性,此時編程人員不直接存取系統命令。相反,編程人員會在某種沙箱內編寫封裝器方法來執行系統命令。紅語言會被解釋和轉換為一組要執行的命令。
通過查看模板系統也可以認識解譯器設計模式。特定的預定義關鍵字或符號被定義為表示其他事物。模板處理器用於接受代碼,解釋每個關鍵字以引用特定的指令集,並執行這些代碼。
構建基於解譯器設計模式的系統允許第三方或使用者更靈活地表示和檢索系統提供的資料。我們並不通過預定義方法名或特定常量來表示檢索資料的類型,而是使用關鍵字檢索這些資料。
UML
該圖詳細說明了一個使用解譯器設計模式的類設計。
以下是對的解釋:
1.MyObject類處理需要被解釋的內容。它具有私人字串content,這個字串儲存需要處理的內容。
2.storeContent()方法接受一個名為content的參數,該方法對處理內容進行預解釋,隨後將結果儲存在MyObject對象內部。
3.隨後會調用applyInterpretation()方法。該方法會建立MyInterpreter類的一個執行個體。MyInterpreter具有一個名為interpretKeys()的公用方法,這個方法接受參數content.applyInterpretation()並擷取該參數的內部內容。MyInterpreter類對要處理的內容執行解釋,並且將結果返回MyObject。接下來,applyInterpretation()方法替換內部的內容變數。
4.最後,MyObject通過getContent()方法提供解釋後的內容。
使用執行個體
文法遞迴的代碼部分需要根據具體的情況來實現,因此在代碼中沒有體現。抽象運算式是產生文法集合的關鍵,每個非終結符運算式解釋一個最小的文法單元,然後通過遞迴的方式將這些文法單元組合成完整的文法,這就是解譯器模式。
class Context {}abstract class Expression {public abstract Object interpreter(Context ctx);}class TerminalExpression extends Expression {public Object interpreter(Context ctx){return null;}}class NonterminalExpression extends Expression {public NonterminalExpression(Expression...expressions){}public Object interpreter(Context ctx){return null;}}public class Client {public static void main(String[] args){String expression = "";char[] charArray = expression.toCharArray();Context ctx = new Context();Stack<Expression> stack = new Stack<Expression>();for(int i=0;i<charArray.length;i++){//進行文法判斷,遞迴調用}Expression exp = stack.pop();exp.interpreter(ctx);}}