javascript設計模式 – 直譯器模式原理與用法例項分析
本文例項講述了javascript設計模式 – 直譯器模式原理與用法。分享給大家供大家參考,具體如下:
介紹:之前在做java開發時,資料庫的增刪改查特別頻繁,並且場景不同需要用到的SQL語句頁都不同,如何用呼叫方法的形式來使用sql語句,拼接sql?這就是這一節我們要講的直譯器模式。
定義:定義一個語言的文法,並且建立一個直譯器來解釋該語言中的句子,這裡的語言是指使用規定格式和語法的程式碼。直譯器模式是一種類行為型模式。
場景:我們實現一個直譯器,用來判斷傳遞的數字是奇數還是偶數,是正數還是負數,是正奇數還是負奇數。
示例:
var TerminalExpression = function(data){ this.data = data; this.interpret = function(context){ if(context === this.data){ return true; } return false; } } var OrExpression = function(exprArr){ this.exprArr = exprArr; this.interpret = function(context){ var isMatch = false; this.exprArr.map(function(item){ if(item.interpret(context)){ isMatch = true; } }) return isMatch; } } var AndExpression = function(exprArr){ this.exprArr = exprArr; this.interpret = function(context){ var isMatch = true; this.exprArr.map(function(item){ if(!item.interpret(context)){ isMatch = false; } }) return isMatch; } } function getEvenExpression(){ var ExpressionList = []; for(var i = -10; i<100; i++){ if(i % 2 == 0){ ExpressionList.push(new TerminalExpression(i)); } } return new OrExpression(ExpressionList); } function getOddExpression(){ var ExpressionList = []; for(var i = -10; i<100; i++){ if(i % 2 != 0){ ExpressionList.push(new TerminalExpression(i)); } } return new OrExpression(ExpressionList); } function getNegativeOddExpression(){ var ExpressionList = []; for(var i = -10; i<100; i++){ if(i < 0){ ExpressionList.push(new TerminalExpression(i)); } } return new OrExpression(ExpressionList); } var isEven = getEvenExpression(); var isOdd = getOddExpression(); var isNegative = getNegativeOddExpression(); var isNegativeAndOdd = new AndExpression([isNegative,isOdd]); console.log('2是偶數嗎? ' + isEven.interpret(2));//2是偶數嗎? true console.log('3是偶數嗎? ' + isEven.interpret(3));//3是偶數嗎? false console.log('3是奇數嗎? ' + isOdd.interpret(3));//3是奇數嗎? true console.log('3是負數嗎? ' + isNegative.interpret(3));//3是負數嗎? false console.log('-3是負數嗎? ' + isNegative.interpret(-3));//-3是負數嗎? true console.log('-3是負奇數嗎? ' + isNegativeAndOdd.interpret(-3));//-3是負奇數嗎? true console.log('-4是負奇數嗎? ' + isNegativeAndOdd.interpret(-4));//-4是負奇數嗎? false console.log('3是負奇數嗎? ' + isNegativeAndOdd.interpret(3));//3是負奇數嗎? false
上面的例子中TerminalExpression被稱為終結符表示式類,封裝底層的判斷條件,一般直譯器模式中只會存在少數幾個終結符表示式類。
OrExpression,AndExpression稱為非終結符表示式類,是基於多個終結符表示式組合而成相對複雜的邏輯。
直譯器模式最核心的就是這兩個類,基於他們可以擴充套件組合出豐富多樣的條件。
雖然直譯器模式的使用頻率不是特別高,但是它在正則表示式,xml文件解釋等領域還是得到了廣泛的應用。
直譯器模式總結:
優點:
* 易於擴充套件和修改文法規則。增加時只需要增加新的終結符表示式,符合開關原則。
缺點:
* 對於複雜文法難以維護,會充滿非終結表示式。
適用場景:
* 可以將一個需要解釋執行的語言中的句子表示為一個抽象語法樹
* 一些重複出現的問題可以用一種簡單的語言來進行表達
* 一個語言文法較為簡單
* 執行效率不是關鍵問題
感興趣的朋友可以使用線上HTML/CSS/JavaScript程式碼執行工具:http://tools.jb51.net/code/HtmlJsRun測試上述程式碼執行效果。
更多關於JavaScript相關內容感興趣的讀者可檢視本站專題:《javascript面向物件入門教程》、《JavaScript錯誤與除錯技巧總結》、《JavaScript資料結構與演算法技巧總結》、《JavaScript遍歷演算法與技巧總結》及《JavaScript數學運算用法總結》
希望本文所述對大家JavaScript程式設計有所幫助。