摘要:保護(hù)代理和虛擬代理保護(hù)代理當(dāng)有許多需求要向某對象發(fā)出一些請求時,可以設(shè)置保護(hù)代理,通過一些條件判斷對請求進(jìn)行過濾。虛擬代理在程序中可以能有一些代價昂貴的操作。而虛擬代理是最常用的一種代理模式。
代理模式
代理模式是為一個對象提供一個代用品或占位符,以便控制對它的訪問。
保護(hù)代理和虛擬代理保護(hù)代理:當(dāng)有許多需求要向某對象發(fā)出一些請求時,可以設(shè)置保護(hù)代理,通過一些條件判斷對請求進(jìn)行過濾。
虛擬代理:在程序中可以能有一些代價昂貴的操作。此時可以設(shè)置虛擬代理去代為執(zhí)行,這里的虛擬代理便會在適合的時候(需要用到的時候)才去執(zhí)行。
保護(hù)代理用于控制不同權(quán)限的對象對目標(biāo)對象的訪問,但在JavaScript并不容易實現(xiàn)保護(hù)代理,因為我們無法判斷誰訪問了某個對象。而虛擬代理是最常用的一種代理模式。虛擬代理實現(xiàn)圖片預(yù)加載
預(yù)加載圖片在Web開發(fā)中十分常用,其通過異步的方式加載圖片,利用一張loading圖片占位。等圖片加載好之后把圖片填充到img節(jié)點(diǎn)中。
var myImage = (function(){ var imgNode = document.createElement("img") document.body.appendChild(imgNode) return { setSrc: function(src){ imgNode.src = src } } })() var proxyImage = (function(){ var img = new Image() img.onload = function(){ myImage.setSrc(this.src) } return { setSrc: function(src){ myImage.setSrc("loading.gif") img.src = src } } })() proxyImage.setSrc("realImage.jpg")
通過proxyImage間接的訪問了MyImage。proxyImage控制了客戶對MyImage的訪問,并且在此過程中加入了一些額外的操作,比如在真正的圖片加載好之前,先把img節(jié)點(diǎn)的src設(shè)置為一張loading圖片。代理的意義
面向?qū)ο笤O(shè)計原則——單一職責(zé)原則。單一職責(zé)原則指的是,就一個類(通常也包括對象和函數(shù)等)而言,應(yīng)該僅有一個引起它變化的原因。如果一個對象承擔(dān)了多項職責(zé),就意味著這個對象將變得巨大,引起它變化的原因會有多個。面向?qū)ο笤O(shè)計鼓勵將行為分布到細(xì)粒度的對象之中,如果一個對象承擔(dān)的職責(zé)過多,等于把這些職責(zé)耦合到了一起,這種耦合會導(dǎo)致脆弱和低內(nèi)聚的設(shè)計,帶變化發(fā)生時,設(shè)計可能會遭到意外的破壞。
虛擬代理例子中,代理模式給系統(tǒng)添加了額外的功能,預(yù)加載圖片。而我們實際需要的只是MyImage的setImage方法。預(yù)加載只是一個錦上添花的功能。通過代理模式使得這兩個功能獨(dú)立開來,遵循了開放-封閉原則。
緩存代理緩存代理可以為一些開銷大的運(yùn)算結(jié)果提供暫時的存儲,在下次運(yùn)算時,如果傳遞進(jìn)來的參數(shù)跟之前一致,則可以直接返回前面存儲的運(yùn)算結(jié)果。
乘積運(yùn)算的例子
/*******計算乘積******/ var mult = function(){ console.log("開始計算乘積") var a = 1 for (var i = 0,l = arguments.length;i最后 雖然代理模式非常有用,但我們在編寫業(yè)務(wù)代碼的時候,往往不需要去預(yù)先猜測是否需要使用代理模式。當(dāng)真正發(fā)現(xiàn)不方便直接訪問某個對象的時候,再編寫代理不遲。代理模式是一種很實用的設(shè)計模式,很好的詮釋了面向?qū)ο笾械膯我宦氊?zé)原則和開放-封閉原則。在實際開發(fā)的時候往往會迫于進(jìn)度壓力或者實現(xiàn)了再說的態(tài)度忽略了一些必要的代碼的可維護(hù)性,我覺得在一些簡單的地方去試著遵循一些設(shè)計理念是對自己代碼能力的提升。當(dāng)然不要為了設(shè)計而設(shè)計啦。
Done is better then Perfect
參考《JavaScript設(shè)計模式與開發(fā)實踐》—— 曾探
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/95345.html
摘要:但實際中,內(nèi)部迭代器和外部迭代器兩者并無優(yōu)劣。迭代器并不只迭代數(shù)組迭代器模式不僅能迭代數(shù)組,還可以迭代一些類數(shù)組對象。晚安了,參考設(shè)計模式與開發(fā)實踐曾探本文作者本文鏈接迭代器模式設(shè)計模式與開發(fā)實踐閱讀筆記 迭代器模式:一個相對簡單的模式,目前絕大多數(shù)語言都內(nèi)置了迭代器,以至于大家都不覺得這是一種設(shè)計模式 迭代器模式 迭代器模式指提供一種方法訪問一個聚合對象中的各個元素,而又不需要暴露該...
摘要:訂閱模式的一個典型的應(yīng)用就是后面會寫一篇相關(guān)的讀書筆記。享元模式享元模式的核心思想是對象復(fù)用,減少對象數(shù)量,減少內(nèi)存開銷。適配器模式對目標(biāo)函數(shù)進(jìn)行數(shù)據(jù)參數(shù)轉(zhuǎn)化,使其符合目標(biāo)函數(shù)所需要的格式。 設(shè)計模式 單例模式 JS的單例模式有別于傳統(tǒng)面向?qū)ο笳Z言的單例模式,js作為一門無類的語言。使用全局變量的模式來實現(xiàn)單例模式思想。js里面的單例又分為普通單例和惰性單例,惰性單例指的是只有這個實例...
摘要:策略模式可以避免代碼中的多重判斷條件。策略模式在程序中或多或少的增加了策略類。此文僅記錄本人閱讀設(shè)計模式與開發(fā)實踐這個本時的感受,感謝作者曾探寫出這么好的一本書。設(shè)計模式中很重要的一點(diǎn)就是將不變和變分離出來。參考設(shè)計模式與開發(fā)實踐曾探 策略模式的定義是:定義一系列的算法,把它們一個個封裝起來,并且是它們可以相互替換。 策略模式可以避免代碼中的多重判斷條件。 策略模式很好的體現(xiàn)了開放-...
摘要:觀察構(gòu)造函數(shù)的代碼,該構(gòu)造函數(shù)實際上負(fù)責(zé)了兩件事情第一是創(chuàng)建對象和執(zhí)行初始化方法,第二是保證只有一個對象。惰性單例在實際開發(fā)中非常有用,是單例模式的重點(diǎn)。 單例模式 單例模式的定義是: 保證一個類僅有一個實例,并提供一個訪問它的全局訪問點(diǎn)。 單例模式是一種常用的模式,有一些對象我們往往只需要一個,比如線程池、全局緩存、瀏覽器的window對象等。例如,當(dāng)我們點(diǎn)擊登錄按鈕時,頁面會彈出一...
摘要:最全正則表達(dá)式總結(jié)驗證號手機(jī)號中文郵編身份證地址等是正則表達(dá)式的縮寫,作用是對字符串執(zhí)行模式匹配。學(xué)習(xí)目標(biāo)了解正則表達(dá)式語法在中使用正則表達(dá)式在中使 JS高級技巧 本篇是看的《JS高級程序設(shè)計》第23章《高級技巧》做的讀書分享。本篇按照書里的思路根據(jù)自己的理解和經(jīng)驗,進(jìn)行擴(kuò)展延伸,同時指出書里的一些問題。將會討論安全的類型檢測、惰性載入函數(shù)、凍結(jié)對象、定時器等話題。1. 安全的類型檢測...
閱讀 2583·2021-10-11 10:58
閱讀 1163·2021-09-29 09:34
閱讀 1521·2021-09-26 09:46
閱讀 3846·2021-09-22 15:31
閱讀 744·2019-08-30 15:54
閱讀 1467·2019-08-30 13:20
閱讀 1262·2019-08-30 13:13
閱讀 1495·2019-08-26 13:52