溫馨提示×

溫馨提示×

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

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

如何使用javascript中的訪問者模式

發(fā)布時間:2020-07-30 14:33:13 來源:億速云 閱讀:232 作者:小豬 欄目:web開發(fā)

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

介紹:訪問者模式比較復雜,它包含訪問者和被訪問元素兩個主要組成部分,這些被訪問的元素通常具有不同的類型,且不同的訪問者可以對他們進行不同的訪問操作。訪問者模式的主要目的是將數(shù)據(jù)結構與數(shù)據(jù)操作相分離。

定義:提供一個作用于某對象結構中的個元素的操作表示,它使得可以再不改變各元素的類的前提下定義作用于這些元素的新操作。訪問者模式是一種對象行為型模式

場景:使用PC結構demo來解釋下訪問者模式

示例:

var Keyboard = function(){
  this.accept = function(computerPartVisitor){
    computerPartVisitor.visit(this);
  }
}
 
var Monitor = function(){
  this.accept = function(computerPartVisitor){
    computerPartVisitor.visit(this);
  }
}
 
var Mouse = function(){
  this.accept = function(computerPartVisitor){
    computerPartVisitor.visit(this);
  }
}
 
var Computer = function(){
  var parts = [new Keyboard(), new Monitor(), new Mouse()];
 
  this.accept = function(computerPartVisitor){
    computerPartVisitor.visit(this);
    _acceptAll(computerPartVisitor);
  }
 
  var _acceptAll = function(computerPartVisitor){
    parts.map(function(item){
      item.accept(computerPartVisitor)
    });
  }
}
 
var ComputerPartDisplayVisitor = function(){
  this.visit = function(item){
    if(item.constructor == Keyboard){
      console.log("Displaying Keyboard.");
    }else if(item.constructor == Monitor){
      console.log("Displaying Monitor.");
    }else if(item.constructor == Mouse){
      console.log("Displaying Mouse.");
    }else if(item.constructor == Computer){
      console.log("Displaying Computer.");
    }else{
      console.log("Error");
    }
  }
}
 
var computer = new Computer();
computer.accept(new ComputerPartDisplayVisitor());
// Displaying Computer.
// Displaying Keyboard.
// Displaying Monitor.
// Displaying Mouse.

這個模式比較復雜,我們先介紹下組成:

  • ComputerPartDisplayVisitor稱為訪問者,它為對象結構中的每一個具體元素例如Keyboard,Mouse等聲明一個訪問操作。當訪問Keyboard時就會輸出Displaying Keyboard。
  • Keyboard,Monitor,Mouse稱為元素,他們包含一個accept方法,用來觸發(fā)傳遞進來的訪問者
  • Computer稱為對象結構,它是一個元素的集合。parts數(shù)組用于存放元素對象,以供不同訪問者訪問。_acceptAll方法用來遍歷內(nèi)部元素。
  • 訪問者通過accept訪問元素內(nèi)部,元素內(nèi)部也可以通過參數(shù)調(diào)用訪問者的visit方法。這種調(diào)用機制稱為雙重分派。

訪問者模式總結:

優(yōu)點:
* 增加新的訪問操作便捷,只需要加一個新的訪問者類。
* 將有關原色對象的訪問行為集合到一個訪問者對象中,類的職責更清晰。
* 讓用戶在不修改現(xiàn)有元素層次結構的情況下,定義作用于該層次結構的操作。

缺點:
* 增加新的元素類很困難,在訪問者模式下,每增加一個新的元素,對應要增加訪問者中的操作。
* 破壞封裝。訪問者模式要求訪問者對象訪問并調(diào)用每一個元素對象的操作,這意味著元素必須暴露一些內(nèi)部操作和內(nèi)部狀態(tài)。

適用場景:
* 一個對象結構包含多個類型的對象,希望對這些對象實施一些依賴其具體類型的操作。
* 需要對一個對象結構中的對象進行橫多不同的并且不相關的操作,而且需要避免讓這些操作污染這些對象的類。
* 對象結構中對象對應的類很少改變,但經(jīng)常需要再次對象結構上定義新的操作。

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

向AI問一下細節(jié)

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

AI