javascript設(shè)計模式 – 解釋器模式原理與用法實例分析
本文實例講述了javascript設(shè)計模式 – 解釋器模式原理與用法。分享給大家供大家參考,具體如下:
介紹:之前在做java開發(fā)時,數(shù)據(jù)庫的增刪改查特別頻繁,并且場景不同需要用到的SQL語句頁都不同,如何用調(diào)用方法的形式來使用sql語句,拼接sql?這就是這一節(jié)我們要講的解釋器模式。
定義:定義一個語言的文法,并且建立一個解釋器來解釋該語言中的句子,這里的語言是指使用規(guī)定格式和語法的代碼。解釋器模式是一種類行為型模式。
場景:我們實現(xiàn)一個解釋器,用來判斷傳遞的數(shù)字是奇數(shù)還是偶數(shù),是正數(shù)還是負數(shù),是正奇數(shù)還是負奇數(shù)。
示例:
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是偶數(shù)嗎? ' + isEven.interpret(2));//2是偶數(shù)嗎? true
console.log('3是偶數(shù)嗎? ' + isEven.interpret(3));//3是偶數(shù)嗎? false
console.log('3是奇數(shù)嗎? ' + isOdd.interpret(3));//3是奇數(shù)嗎? true
console.log('3是負數(shù)嗎? ' + isNegative.interpret(3));//3是負數(shù)嗎? false
console.log('-3是負數(shù)嗎? ' + isNegative.interpret(-3));//-3是負數(shù)嗎? true
console.log('-3是負奇數(shù)嗎? ' + isNegativeAndOdd.interpret(-3));//-3是負奇數(shù)嗎? true
console.log('-4是負奇數(shù)嗎? ' + isNegativeAndOdd.interpret(-4));//-4是負奇數(shù)嗎? false
console.log('3是負奇數(shù)嗎? ' + isNegativeAndOdd.interpret(3));//3是負奇數(shù)嗎? false
上面的例子中TerminalExpression被稱為終結(jié)符表達式類,封裝底層的判斷條件,一般解釋器模式中只會存在少數(shù)幾個終結(jié)符表達式類。
OrExpression,AndExpression稱為非終結(jié)符表達式類,是基于多個終結(jié)符表達式組合而成相對復(fù)雜的邏輯。
解釋器模式最核心的就是這兩個類,基于他們可以擴展組合出豐富多樣的條件。
雖然解釋器模式的使用頻率不是特別高,但是它在正則表達式,xml文檔解釋等領(lǐng)域還是得到了廣泛的應(yīng)用。
解釋器模式總結(jié):
優(yōu)點:
* 易于擴展和修改文法規(guī)則。增加時只需要增加新的終結(jié)符表達式,符合開關(guān)原則。
缺點:
* 對于復(fù)雜文法難以維護,會充滿非終結(jié)表達式。
* 執(zhí)行效率低,由于使用了大量循環(huán)和遞歸調(diào)用,在解釋復(fù)雜句子時速度很慢。
適用場景:
* 可以將一個需要解釋執(zhí)行的語言中的句子表示為一個抽象語法樹
* 一些重復(fù)出現(xiàn)的問題可以用一種簡單的語言來進行表達
* 一個語言文法較為簡單
* 執(zhí)行效率不是關(guān)鍵問題
感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運行工具:http://tools.jb51.net/code/HtmlJsRun測試上述代碼運行效果。
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript錯誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運算用法總結(jié)》
希望本文所述對大家JavaScript程序設(shè)計有所幫助。
- JavaScript設(shè)計模式之模板方法模式原理與用法示例
- 學(xué)習(xí)JavaScript設(shè)計模式之模板方法模式
- javascript設(shè)計模式 – 觀察者模式原理與用法實例分析
- javascript設(shè)計模式 – 狀態(tài)模式原理與用法實例分析
- javascript設(shè)計模式 – 策略模式原理與用法實例分析
- javascript設(shè)計模式 – 備忘錄模式原理與用法實例分析
- javascript設(shè)計模式 – 中介者模式原理與用法實例分析
- javascript設(shè)計模式 – 命令模式原理與用法實例分析
- javascript設(shè)計模式 – 迭代器模式原理與用法實例分析
- javascript設(shè)計模式 – 裝飾模式原理與應(yīng)用實例分析
- javascript設(shè)計模式 – 組合模式原理與應(yīng)用實例分析
- javascript設(shè)計模式 – 模板方法模式原理與用法實例分析
相關(guān)文章
關(guān)于javascript中偽數(shù)組和真數(shù)組的一些小秘密
在javascript中,偽數(shù)組又稱類數(shù)組,是一個類似數(shù)組的對象,是一種按照索引存儲數(shù)據(jù)且具有l(wèi)ength屬性的對象,下面這篇文章主要給大家介紹了關(guān)于javascript中偽數(shù)組和真數(shù)組的一些小秘密,需要的朋友可以參考下2022-08-08
JS PHP字符串截取函數(shù)實現(xiàn)原理解析
這篇文章主要介紹了JS PHP字符串截取函數(shù)實現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08
JS實現(xiàn)iframe自適應(yīng)高度的方法示例
這篇文章主要介紹了JS實現(xiàn)iframe自適應(yīng)高度的方法,結(jié)合實例形式分析了JS實現(xiàn)iframe高度自適應(yīng)的實現(xiàn)技巧,并給出了項目示例供大家參考,需要的朋友可以參考下2017-01-01

