javascript設(shè)計(jì)模式 – 解釋器模式原理與用法實(shí)例分析
本文實(shí)例講述了javascript設(shè)計(jì)模式 – 解釋器模式原理與用法。分享給大家供大家參考,具體如下:
介紹:之前在做java開(kāi)發(fā)時(shí),數(shù)據(jù)庫(kù)的增刪改查特別頻繁,并且場(chǎng)景不同需要用到的SQL語(yǔ)句頁(yè)都不同,如何用調(diào)用方法的形式來(lái)使用sql語(yǔ)句,拼接sql?這就是這一節(jié)我們要講的解釋器模式。
定義:定義一個(gè)語(yǔ)言的文法,并且建立一個(gè)解釋器來(lái)解釋該語(yǔ)言中的句子,這里的語(yǔ)言是指使用規(guī)定格式和語(yǔ)法的代碼。解釋器模式是一種類(lèi)行為型模式。
場(chǎng)景:我們實(shí)現(xiàn)一個(gè)解釋器,用來(lái)判斷傳遞的數(shù)字是奇數(shù)還是偶數(shù),是正數(shù)還是負(fù)數(shù),是正奇數(shù)還是負(fù)奇數(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是負(fù)數(shù)嗎? ' + isNegative.interpret(3));//3是負(fù)數(shù)嗎? false console.log('-3是負(fù)數(shù)嗎? ' + isNegative.interpret(-3));//-3是負(fù)數(shù)嗎? true console.log('-3是負(fù)奇數(shù)嗎? ' + isNegativeAndOdd.interpret(-3));//-3是負(fù)奇數(shù)嗎? true console.log('-4是負(fù)奇數(shù)嗎? ' + isNegativeAndOdd.interpret(-4));//-4是負(fù)奇數(shù)嗎? false console.log('3是負(fù)奇數(shù)嗎? ' + isNegativeAndOdd.interpret(3));//3是負(fù)奇數(shù)嗎? false
上面的例子中TerminalExpression被稱(chēng)為終結(jié)符表達(dá)式類(lèi),封裝底層的判斷條件,一般解釋器模式中只會(huì)存在少數(shù)幾個(gè)終結(jié)符表達(dá)式類(lèi)。
OrExpression,AndExpression稱(chēng)為非終結(jié)符表達(dá)式類(lèi),是基于多個(gè)終結(jié)符表達(dá)式組合而成相對(duì)復(fù)雜的邏輯。
解釋器模式最核心的就是這兩個(gè)類(lèi),基于他們可以擴(kuò)展組合出豐富多樣的條件。
雖然解釋器模式的使用頻率不是特別高,但是它在正則表達(dá)式,xml文檔解釋等領(lǐng)域還是得到了廣泛的應(yīng)用。
解釋器模式總結(jié):
優(yōu)點(diǎn):
* 易于擴(kuò)展和修改文法規(guī)則。增加時(shí)只需要增加新的終結(jié)符表達(dá)式,符合開(kāi)關(guān)原則。
缺點(diǎn):
* 對(duì)于復(fù)雜文法難以維護(hù),會(huì)充滿(mǎn)非終結(jié)表達(dá)式。
* 執(zhí)行效率低,由于使用了大量循環(huán)和遞歸調(diào)用,在解釋復(fù)雜句子時(shí)速度很慢。
適用場(chǎng)景:
* 可以將一個(gè)需要解釋執(zhí)行的語(yǔ)言中的句子表示為一個(gè)抽象語(yǔ)法樹(shù)
* 一些重復(fù)出現(xiàn)的問(wèn)題可以用一種簡(jiǎn)單的語(yǔ)言來(lái)進(jìn)行表達(dá)
* 一個(gè)語(yǔ)言文法較為簡(jiǎn)單
* 執(zhí)行效率不是關(guān)鍵問(wèn)題
感興趣的朋友可以使用在線(xiàn)HTML/CSS/JavaScript代碼運(yùn)行工具:http://tools.jb51.net/code/HtmlJsRun測(cè)試上述代碼運(yùn)行效果。
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《javascript面向?qū)ο笕腴T(mén)教程》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
- JavaScript設(shè)計(jì)模式之模板方法模式原理與用法示例
- 學(xué)習(xí)JavaScript設(shè)計(jì)模式之模板方法模式
- javascript設(shè)計(jì)模式 – 觀察者模式原理與用法實(shí)例分析
- javascript設(shè)計(jì)模式 – 狀態(tài)模式原理與用法實(shí)例分析
- javascript設(shè)計(jì)模式 – 策略模式原理與用法實(shí)例分析
- javascript設(shè)計(jì)模式 – 備忘錄模式原理與用法實(shí)例分析
- javascript設(shè)計(jì)模式 – 中介者模式原理與用法實(shí)例分析
- javascript設(shè)計(jì)模式 – 命令模式原理與用法實(shí)例分析
- javascript設(shè)計(jì)模式 – 迭代器模式原理與用法實(shí)例分析
- javascript設(shè)計(jì)模式 – 裝飾模式原理與應(yīng)用實(shí)例分析
- javascript設(shè)計(jì)模式 – 組合模式原理與應(yīng)用實(shí)例分析
- javascript設(shè)計(jì)模式 – 模板方法模式原理與用法實(shí)例分析
相關(guān)文章
微信小程序獲取微信運(yùn)動(dòng)步數(shù)的實(shí)例代碼
本篇文章主要介紹了微信小程序微信運(yùn)動(dòng)步數(shù)的實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07JS實(shí)現(xiàn)判斷兩個(gè)日期不能跨年和跨月
這篇文章主要為大家詳細(xì)介紹了如何利用JavaScript語(yǔ)言實(shí)現(xiàn)判斷兩個(gè)日期不能跨年和跨月,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-04-04javascript解決innerText瀏覽器兼容問(wèn)題思路代碼
innerText瀏覽器兼容這塊始終都是一個(gè)問(wèn)題,下面與大家分享下使用javascript解決,感興趣的朋友可以參考下哈,希望對(duì)你有所幫助2013-05-05JavaScript利用crypto模塊實(shí)現(xiàn)加解密
crypto模塊提供了加密功能,包含對(duì) OpenSSL 的哈希、HMAC、加密、解密、簽名、以及驗(yàn)證功能的一整套封裝。本文將利用它實(shí)現(xiàn)加解密算法,需要的可以參考一下2023-02-02javascript中2個(gè)感嘆號(hào)的用法實(shí)例詳解
這篇文章主要介紹了javascript中2個(gè)感嘆號(hào)的用法,并用大量的實(shí)例講述了!!的常見(jiàn)應(yīng)用情況,是非常實(shí)用的技巧,需要的朋友可以參考下2014-09-09小程序云開(kāi)發(fā)獲取不到數(shù)據(jù)庫(kù)記錄的解決方法
這篇文章主要為大家詳細(xì)介紹了小程序云開(kāi)發(fā)獲取不到數(shù)據(jù)庫(kù)記錄的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05TypeScript調(diào)整數(shù)組元素順序算法
數(shù)組類(lèi)型在TS中可以使用多種方式,比較靈活,下面這篇文章主要給大家介紹了關(guān)于TypeScript調(diào)整數(shù)組元素順序算法的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04