溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-08-03 10:39:09 來源:億速云 閱讀:131 作者:小豬 欄目:web開發

這篇文章主要講解了如何使用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文檔解釋等領域還是得到了廣泛的應用。

解釋器模式總結:

優點:
* 易于擴展和修改文法規則。增加時只需要增加新的終結符表達式,符合開關原則。

缺點:
* 對于復雜文法難以維護,會充滿非終結表達式。
* 執行效率低,由于使用了大量循環和遞歸調用,在解釋復雜句子時速度很慢。

適用場景:
* 可以將一個需要解釋執行的語言中的句子表示為一個抽象語法樹
* 一些重復出現的問題可以用一種簡單的語言來進行表達
* 一個語言文法較為簡單
* 執行效率不是關鍵問題

看完上述內容,是不是對如何使用javascript中的解釋器模式有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女