javascript設(shè)計(jì)模式 – 訪問(wèn)者模式原理與用法實(shí)例分析
本文實(shí)例講述了javascript設(shè)計(jì)模式 – 訪問(wèn)者模式原理與用法。分享給大家供大家參考,具體如下:
介紹:訪問(wèn)者模式比較復(fù)雜,它包含訪問(wèn)者和被訪問(wèn)元素兩個(gè)主要組成部分,這些被訪問(wèn)的元素通常具有不同的類型,且不同的訪問(wèn)者可以對(duì)他們進(jìn)行不同的訪問(wèn)操作。訪問(wèn)者模式的主要目的是將數(shù)據(jù)結(jié)構(gòu)與數(shù)據(jù)操作相分離。
定義:提供一個(gè)作用于某對(duì)象結(jié)構(gòu)中的個(gè)元素的操作表示,它使得可以再不改變各元素的類的前提下定義作用于這些元素的新操作。訪問(wèn)者模式是一種對(duì)象行為型模式
場(chǎng)景:使用PC結(jié)構(gòu)demo來(lái)解釋下訪問(wèn)者模式
示例:
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.
這個(gè)模式比較復(fù)雜,我們先介紹下組成:
- ComputerPartDisplayVisitor稱為訪問(wèn)者,它為對(duì)象結(jié)構(gòu)中的每一個(gè)具體元素例如Keyboard,Mouse等聲明一個(gè)訪問(wèn)操作。當(dāng)訪問(wèn)Keyboard時(shí)就會(huì)輸出Displaying Keyboard。
- Keyboard,Monitor,Mouse稱為元素,他們包含一個(gè)accept方法,用來(lái)觸發(fā)傳遞進(jìn)來(lái)的訪問(wèn)者
- Computer稱為對(duì)象結(jié)構(gòu),它是一個(gè)元素的集合。parts數(shù)組用于存放元素對(duì)象,以供不同訪問(wèn)者訪問(wèn)。_acceptAll方法用來(lái)遍歷內(nèi)部元素。
- 訪問(wèn)者通過(guò)accept訪問(wèn)元素內(nèi)部,元素內(nèi)部也可以通過(guò)參數(shù)調(diào)用訪問(wèn)者的visit方法。這種調(diào)用機(jī)制稱為雙重分派。
訪問(wèn)者模式總結(jié):
優(yōu)點(diǎn):
* 增加新的訪問(wèn)操作便捷,只需要加一個(gè)新的訪問(wèn)者類。
* 將有關(guān)原色對(duì)象的訪問(wèn)行為集合到一個(gè)訪問(wèn)者對(duì)象中,類的職責(zé)更清晰。
* 讓用戶在不修改現(xiàn)有元素層次結(jié)構(gòu)的情況下,定義作用于該層次結(jié)構(gòu)的操作。
缺點(diǎn):
* 增加新的元素類很困難,在訪問(wèn)者模式下,每增加一個(gè)新的元素,對(duì)應(yīng)要增加訪問(wèn)者中的操作。
* 破壞封裝。訪問(wèn)者模式要求訪問(wèn)者對(duì)象訪問(wèn)并調(diào)用每一個(gè)元素對(duì)象的操作,這意味著元素必須暴露一些內(nèi)部操作和內(nèi)部狀態(tài)。
適用場(chǎng)景:
* 一個(gè)對(duì)象結(jié)構(gòu)包含多個(gè)類型的對(duì)象,希望對(duì)這些對(duì)象實(shí)施一些依賴其具體類型的操作。
* 需要對(duì)一個(gè)對(duì)象結(jié)構(gòu)中的對(duì)象進(jìn)行橫多不同的并且不相關(guān)的操作,而且需要避免讓這些操作污染這些對(duì)象的類。
* 對(duì)象結(jié)構(gòu)中對(duì)象對(duì)應(yīng)的類很少改變,但經(jīng)常需要再次對(duì)象結(jié)構(gòu)上定義新的操作。
感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運(yùn)行工具:http://tools.jb51.net/code/HtmlJsRun測(cè)試上述代碼運(yùn)行效果。
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
相關(guān)文章
JS關(guān)閉窗口時(shí)產(chǎn)生的事件及用法示例
這篇文章主要介紹了JS關(guān)閉窗口時(shí)產(chǎn)生的事件及用法,結(jié)合關(guān)閉窗口時(shí)提交評(píng)論的實(shí)例分析了javascript事件觸發(fā)機(jī)制及遮罩層實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-08-08使用Cookies保存網(wǎng)站歷史瀏覽記錄實(shí)例代碼
仿淘寶網(wǎng)的最近瀏覽記錄功能,喜歡的朋友可以參考下。2010-07-0715 個(gè) JavaScript Web UI 庫(kù)
本文介紹了 15 個(gè)非常強(qiáng)大的 JavaScript Web UI 庫(kù),非常適合各種各種規(guī)模的富 Web 應(yīng)用的開(kāi)發(fā)。2010-05-05js 實(shí)現(xiàn) input type="file" 文件上傳示例代碼
在開(kāi)發(fā)中,文件上傳必不可少但是它長(zhǎng)得又丑、瀏覽的字樣不能換,一般會(huì)讓其隱藏點(diǎn)其他的標(biāo)簽(圖片等)來(lái)時(shí)實(shí)現(xiàn)選擇文件上傳功能2013-08-08js運(yùn)動(dòng)應(yīng)用實(shí)例解析
這篇文章主要針對(duì)js運(yùn)動(dòng)應(yīng)用進(jìn)行實(shí)例解析2015-12-12JavaScript+Java實(shí)現(xiàn)HTML頁(yè)面轉(zhuǎn)為PDF文件保存的方法
借助iText這個(gè)Java庫(kù),我們可以將HTML文件保存為圖片文件進(jìn)而轉(zhuǎn)換成PDF格式,接下來(lái)就來(lái)具體看下JavaScript+Java實(shí)現(xiàn)HTML頁(yè)面轉(zhuǎn)為PDF文件保存的方法2016-05-05mpvue網(wǎng)易云短信接口實(shí)現(xiàn)小程序短信登錄的示例代碼
這篇文章主要介紹了mpvue網(wǎng)易云短信接口實(shí)現(xiàn)小程序短信登錄的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04微信小程序?qū)崿F(xiàn)同時(shí)上傳多張圖片
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)同時(shí)上傳多張圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02