溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何使用javascript中的解釋器模式

發(fā)布時(shí)間:2020-08-03 10:39:09 來源:億速云 閱讀:119 作者:小豬 欄目:web開發(fā)

這篇文章主要講解了如何使用javascript中的解釋器模式,內(nèi)容清晰明了,對(duì)此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會(huì)有幫助。

介紹:之前在做java開發(fā)時(shí),數(shù)據(jù)庫(kù)的增刪改查特別頻繁,并且場(chǎng)景不同需要用到的SQL語句頁(yè)都不同,如何用調(diào)用方法的形式來使用sql語句,拼接sql?這就是這一節(jié)我們要講的解釋器模式。

定義:定義一個(gè)語言的文法,并且建立一個(gè)解釋器來解釋該語言中的句子,這里的語言是指使用規(guī)定格式和語法的代碼。解釋器模式是一種類行為型模式。

場(chǎng)景:我們實(shí)現(xiàn)一個(gè)解釋器,用來判斷傳遞的數(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被稱為終結(jié)符表達(dá)式類,封裝底層的判斷條件,一般解釋器模式中只會(huì)存在少數(shù)幾個(gè)終結(jié)符表達(dá)式類。
OrExpression,AndExpression稱為非終結(jié)符表達(dá)式類,是基于多個(gè)終結(jié)符表達(dá)式組合而成相對(duì)復(fù)雜的邏輯。
解釋器模式最核心的就是這兩個(gè)類,基于他們可以擴(kuò)展組合出豐富多樣的條件。
雖然解釋器模式的使用頻率不是特別高,但是它在正則表達(dá)式,xml文檔解釋等領(lǐng)域還是得到了廣泛的應(yīng)用。

解釋器模式總結(jié):

優(yōu)點(diǎn):
* 易于擴(kuò)展和修改文法規(guī)則。增加時(shí)只需要增加新的終結(jié)符表達(dá)式,符合開關(guān)原則。

缺點(diǎn):
* 對(duì)于復(fù)雜文法難以維護(hù),會(huì)充滿非終結(jié)表達(dá)式。
* 執(zhí)行效率低,由于使用了大量循環(huán)和遞歸調(diào)用,在解釋復(fù)雜句子時(shí)速度很慢。

適用場(chǎng)景:
* 可以將一個(gè)需要解釋執(zhí)行的語言中的句子表示為一個(gè)抽象語法樹
* 一些重復(fù)出現(xiàn)的問題可以用一種簡(jiǎn)單的語言來進(jìn)行表達(dá)
* 一個(gè)語言文法較為簡(jiǎn)單
* 執(zhí)行效率不是關(guān)鍵問題

看完上述內(nèi)容,是不是對(duì)如何使用javascript中的解釋器模式有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI