摘要:虛擬代理虛擬代理把一些開銷很大的對象,延遲到真正需要它的時候才去創建。主要參考設計模式與開發實踐
設計模式
在面向對象軟件設計過程中針對特定問題的簡潔而優雅的解決方案。
這是在《設計模式》一書中對設計模式的定義。在軟件開發過程中,我們可能會遇到過這樣的情況,我們現在發現一個問題,和以前的某個問題很相似,幾乎可以用統一套解決方案,而且我們還發現,在某個條件下,這個解決方案幾乎就是通用的,于是我們決定給解決類似問題的解決方案取一個統一的名字,這就是設計模式。
設計模式的意義我們都知道無論在哪個行業經驗都很重要,而經驗的意義也就在于,當我們遇見一個以前遇見過的問題的時候,會自燃的想到以前是怎么解決的。而模式則是經過大量的實際項目驗證過的優秀的解決方案,當我們熟悉了模式,就可以在適當的環境下,條件反射式地自如地使用它們。
所有設計模式的實現抖遵循一條原則,即“找出程序中變化的地方,并將變化封裝起來”。一個程序的設計總是可以分為可變的部分和不可變的部分。當我們找出可變的部分并把這些部分封裝起來,那么剩下的就是不變和穩定的部分。這些不變和穩定的部分是非常容易復用的。這也就是設計模式為什么描寫的是可復用面向對象軟件基礎的原因。
當我看到上面這段話的時候,我就決定要把設計模式要好好的學一學,爛代碼到處可見,但是我們不應該讓別人看到我們的代碼后,覺得寫的代碼是爛代碼,而上面這段話則精辟的總結了如何避免寫出爛代碼。
代理模式 簡單實現當我們不能或者不想直接訪問某個對象或者方法,需要使用一個中間對象來訪問這個對象的時候,就可以稱之為代理模式。例如我們現在交電話費可以直接通過支付寶來支付,不用再去跑到營業廳支付。此時,支付寶平臺實際就是一種代理,最后,它還是要把錢支付給電信公司。
var Money = function(amount) { this.amount = amount }; var customer = { pay: function(target) { var money = new Money(50); target.receiveMoney(money.amount) } } var agent = { receiveMoney: function(amount) { mobileCompanies.receiveMoney(amount) } } var mobileCompanies = { receiveMoney: function(amount) { alert("繳費成功,您成功繳費"+amount+"元") } } customer.pay(agent) // 50保護代理和虛擬代理 保護代理
通過中間的代理層我們可以過濾掉一些請求,比如可以校驗用戶的賬戶的有效性,對于一些無效的繳費請求可以直接在這里就過濾掉。這樣的代理模式稱之為保護代理,即控制對實體的訪問頻率,例如當我們有一個接口請求的數據量很大,訪問量也很大的時候,可能就需要嚴格控制對這個接口的訪問,但是同時我們又不想更改這個函數的代碼,增加校驗代碼,這時就可以通過保護代理模式。
虛擬代理保護代理用于控制不同權限的對象對目標對象的訪問。
虛擬代理把一些開銷很大的對象,延遲到真正需要它的時候才去創建。
虛擬代理實現圖片與加載
當圖片過大或者網絡狀況不佳的情況下,圖片往往有一段時間是空白的,常用的解決方案是先用一個loaging占位,待圖片加載完成的時候再把它填充到img節點里面。
var imageNode = (function(){ var imgNode = document.createElement("img") document.getElementById("testImg").appendChild(node) return { setSrc: function(src) { imgNode.src = src } } })() var agent = (function(){ vat image = new Image() image.onLoad = function() { imageNode.setSrc(this.src) } return { setSrc: function(src) { imageNode.setSrc("C:/user/test.gif") img.src = src } } })() agent.setSrc("http://test.com/test.jpg")代理的意義
根據單一指責原則,就一個類或則方法而言,應該僅有一個使它變化的原因。如果一個類或者方法承擔了多項職責,不止意味著它變的很大,同時引起它變化的原因也會很多。比如上面的方法中,圖片的預加載只是一種錦上添花的效果,如果有一天我們不再需要預加載的時候,我們不需要改變imgNode對象。所以代理即隔離了變化的部分,即預加載功能,又能在適當的時候調用,即加載完成,當然在代理中間還可以有很多其他的操作,正是如開頭所說的,將變化的部分封裝起來,將不變的地方抽取出來。
主要參考《JavaScript設計模式與開發實踐》
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/79278.html
摘要:虛擬代理如果需要創建一個資源消耗較大的對象,先創建一個消耗相對較小的對象來表示,真實對象只在需要時才會被真正創建。虛擬代理通過使用一個小對象來代表一個大對象,可以減少系統資源的消耗,對系統進行優化并提高運行速度。 概念 代理模式(Proxy Pattern) :一種對象結構型模式。給某一個對象提供一個代理,并由代理對象控制對原對象的引用。 UML showImg(https://seg...
摘要:聊完了工廠模式,下面我們來說框架中的另一個核心設計模式代理模式。這里的外賣小哥就相當于是我們的代理。主要分為代理和代理。 聊完了工廠模式,下面我們來說Spring框架中的另一個核心設計模式——代理模式(Proxy Pattern)。 代理模式 大家可以先不用看概念,先舉個吃飯的例子:比如說我們想吃飯,我們可以選擇自己做飯吃、去飯店吃、叫外賣吃。如果我們選擇自己做著吃,我們就需要去買菜、...
摘要:最近在讀設計模式與開發實踐,在這里把文中的各種設計模式寫出來,以便加深記憶,也可以分享給初學者。經紀人可以全權代表明星和客戶談判,最后把談判結果給明星,明星決定簽約與否。這也違反了面向對象設計原則中的單一職責原則。 最近在讀《javascript設計模式與開發實踐》,在這里把文中的各種設計模式寫出來,以便加深記憶,也可以分享給初學者。如果你不了解設計模式,那么強烈推薦你閱讀一下這本書,...
摘要:什么是代理模式代理模式,類似于明星的經紀人,想要拜訪明星,需要先通過經紀人的溝通。不同于裝飾器,那種動態加載一個對象,可以說在代理模式當中,代理是早已既定的。又稱單一功能原則,面向對象五個基本原則之一。 什么是代理模式 代理模式,類似于明星的經紀人,想要拜訪明星,需要先通過經紀人的溝通。而在JS當中,如果想訪問一個類,需要通過另一個類來間接訪問 。不同于裝飾器,那種動態加載一個對象,可...
閱讀 3145·2021-11-22 12:01
閱讀 3767·2021-08-30 09:46
閱讀 783·2019-08-30 13:48
閱讀 3209·2019-08-29 16:43
閱讀 1657·2019-08-29 16:33
閱讀 1847·2019-08-29 13:44
閱讀 1410·2019-08-26 13:45
閱讀 2228·2019-08-26 11:44