什麼是解釋器模式?
解釋器設計模式用於分析一個實體的關鍵元素,並且針對每個元素提供自己的解釋或相應的動作。
#解釋器模式問題與解決方案
解釋器設計模式是我們經常使用但未意識到的少數幾個常見設計模式之一。並未限制這種設計模式只用於類別的創建。在創建大多數程式設計演算法的過程中,我們都會使用到解釋器設計模式的基本概念。
為了理解解譯器設計模式的工作原理,我們以巨集語言的處理為例。為每個巨集編寫的命令本身就是更多命令的集合。簡化的巨集語言使程式設計師不必考慮其他系統命令的語法就能夠更容易的完成創建操作。在某些情況下,這也能提升安全性,此時程式設計人員不會直接存取系統指令。相反,程式設計人員會在某種沙箱內編寫包裝器方法來執行系統指令。紅語言會被解釋和轉換為一組要執行的命令。
透過查看模板系統也可以認識解釋器設計模式。特定的預定義關鍵字或符號被定義為表示其他事物。模板處理器用於接受程式碼,解釋每個關鍵字以引用特定的指令集,並執行這些程式碼。
建立基於解釋器設計模式的系統允許第三方或使用者更靈活地表示和檢索系統提供的資料。我們並不是透過預先定義方法名稱或特定常數來表示檢索資料的類型,而是使用關鍵字來檢索這些資料。
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); } }
以上是PHP物件導向進階設計模式:解譯器模式使用實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!