1. 程式人生 > 程式設計 >javascript設計模式 – 訪問者模式原理與用法例項分析

javascript設計模式 – 訪問者模式原理與用法例項分析

本文例項講述了javascript設計模式 – 訪問者模式原理與用法。分享給大家供大家參考,具體如下:

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

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

場景:使用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方法,用來觸發傳遞進來的訪問者
  • Computer稱為物件結構,它是一個元素的集合。parts陣列用於存放元素物件,以供不同訪問者訪問。_acceptAll方法用來遍歷內部元素。
  • 訪問者通過accept訪問元素內部,元素內部也可以通過引數呼叫訪問者的visit方法。這種呼叫機制稱為雙重分派。

訪問者模式總結:

優點:
* 增加新的訪問操作便捷,只需要加一個新的訪問者類。
* 將有關原色物件的訪問行為集合到一個訪問者物件中,類的職責更清晰。
* 讓使用者在不修改現有元素層次結構的情況下,定義作用於該層次結構的操作。

缺點:
* 增加新的元素類很困難,在訪問者模式下,每增加一個新的元素,對應要增加訪問者中的操作。
* 破壞封裝。訪問者模式要求訪問者物件訪問並呼叫每一個元素物件的操作,這意味著元素必須暴露一些內部操作和內部狀態。

適用場景:
* 一個物件結構包含多個型別的物件,希望對這些物件實施一些依賴其具體型別的操作。
* 需要對一個物件結構中的物件進行橫多不同的並且不相關的操作,而且需要避免讓這些操作汙染這些物件的類。

* 物件結構中物件對應的類很少改變,但經常需要再次物件結構上定義新的操作。

感興趣的朋友可以使用線上HTML/CSS/JavaScript程式碼執行工具:http://tools.jb51.net/code/HtmlJsRun測試上述程式碼執行效果。

更多關於JavaScript相關內容感興趣的讀者可檢視本站專題:《javascript面向物件入門教程》、《JavaScript錯誤與除錯技巧總結》、《JavaScript資料結構與演算法技巧總結》、《JavaScript遍歷演算法與技巧總結》及《JavaScript數學運算用法總結》

希望本文所述對大家JavaScript程式設計有所幫助。