一,總體概要
1,筆者淺談
當我們瀏覽網頁時,網頁中的圖片有時不會立即展示出來,這就是通過虛擬代理來替代了真實的圖片,而代理存儲了真實圖片的路徑和尺寸,這就是代理方式的一種。
代理模式是比較有用途的一種模式,而且變種較多(虛代理、遠程代理、copy-on-write代理、保護代理、Cache代理、防火牆代理、同步代理、智能指引),應用場合覆蓋從小結構到整個系統的大結構,
我們也許有代理服務器等概念,代理概念可以解釋為:在出發點到目的地之間有一道中間層,意為代理。
代理對象角色內部含有對真實對象的引用,從而可以操作真實對象,同時代理對象提供與真實對象相同的接口以便在任何時刻都能代替真實對象。
咱們來看一個例子,如下:
1 function XiaoV(){ 2 this.talk = function(){ 3 console.log("狼貓老弟,不好意思上次的事,請多多諒解。") ; 4 } ; 5 } ; 6 function LangMao(){ 7 this.bb = new BigBear() ; 8 this.talk = function(){ 9 console.log("大熊君好啊,最忌忙什么那?") ; 10 this.bb.talk() ; 11 } ; 12 } ; 13 function BigBear(){ 14 this.xiaov = new XiaoV() ; 15 this.talk = function(){ 16 console.log("狼貓兄弟,中午沒事一起吃頓飯聊聊天,那天我見到小v了,他優化和你說。。。。。。") ; 17 this.xiaov.talk() ; 18 } ; 19 } ; 20 function go(){ 21 new LangMao().talk() ; 22 } ;
小v和狼貓有點誤會,由大熊君幫着緩和一下誤會慢慢解除了。O(∩_∩)O哈哈哈~
二,源碼案例參考
描述------地理編碼對象模擬谷歌地圖地理編碼服務。在地理編碼提供一個位置(在地球上的一個地方),它將返回它的緯度/經度(參數)。我們的地理編碼可以解決只有4個位置,但在現實中有數以百萬計,因為它涉及到國家,城市,街道。
程序員決定實施一個代理對象因為地理編碼相對緩慢。代理對象叫做GeoProxy。它是已知的許多重復的要求(同一位置)來。加快速度GeoProxy緩存經常請求的位置。如果一個位置是不是已經緩存而是走到真實的地理編碼服務和存儲在緩存結果。
幾個城市的位置查詢,這些都為同一個城市。GeoProxy建立其緩存同時支持這些電話。最后GeoProxy<已處理了11個要求而不得不去請求只有3次。請注意,客戶端程序不了解代理對象(它調用標准getlatlng方法相同的接口)。見代碼如下:
GeoProxy於真實對象相同的接口以便在任何時刻都能代替真實對象完成特定操作,並且在其中間植入其他相關任務功能。
三,案例引入
注冊普通用戶:code為“001”
論壇管理者 :code為“002”
系統管理者 :code為“003”
游 客 :code為“000”
論壇開放了四個基礎功能
1,發帖
2,帖子審核
3,清除帖子
4,留言
游客不具備任何操作權限,注冊用戶只能發帖,論壇管理者可以審核以及刪帖操作,系統管理者具有所有功能權限。
這些權限划分和管理是使用Proxy完成的。
(1),創建用戶實體類
1 function User(name,code){ 2 this.name = name ; 3 this.code = code ; 4 } ; 5 User.prototype = { 6 getName : function(){ 7 return this.name ; 8 } , 9 getCode : function(){ 10 return this.code ; 11 } , 12 post : function(){ 13 console.log("發帖子!") ; 14 } , 15 remove : function(){ 16 console.log("刪除帖子!") ; 17 } , 18 check : function(){ 19 console.log("審核帖子!") ; 20 } , 21 comment : function(){ 22 console.log("回復帖子!") ; 23 } 24 } ;
(2),創建論壇類
1 function Forum(user){ 2 this.user = user ; 3 } ; 4 Forum.prototype = { 5 getUser : function(){ 6 return this.user ; 7 } , 8 post : function(){ 9 if(this.user.getCode() == "001" || this.user.getCode() == "003"){ 10 return this.user.post() ; 11 } 12 console.log("沒權限發帖子!") ; 13 } , 14 remove : function(){ 15 if(this.user.getCode() == "002" || this.user.getCode() == "003"){ 16 return this.user.remove() ; 17 } 18 console.log("沒權限刪除帖子!") ; 19 } , 20 check : function(){ 21 if(this.user.getCode() == "002" || this.user.getCode() == "003"){ 22 return this.user.check() ; 23 } 24 console.log("沒權限審核帖子!") ; 25 } , 26 comment : function(){ 27 if(this.user.getCode() == "003"){ 28 return this.user.comment() ; 29 } 30 console.log("沒權限回復帖子!") ; 31 } 32 } ;
(3),創建客戶端測試類
1 function ForumClient(){ 2 this.run = function(){ 3 new Forum(new User("bigbear","003")).check() ; // 審核帖子 4 } 5 } ;
以上例子中Forum於真實對象相同的接口以便在任何時刻都能代替真實對象完成特定操作,並且在其中間植入其他相關任務功能。
四,總結一下
抽象角色:聲明真實對象和代理對象的共同接口。
代理角色:代理對象角色內部含有對真實對象的引用,從而可以操作真實對象,同時代理對象提供與真實對象相同的接口以便在任何時刻都能代替真實對象。同時,代理對象可以在執行真實對象操作時,附加其他的操作,相當於對真實對象進行封裝。
真實角色:代理角色所代表的真實對象,是我們最終要引用的對象。
代理模式的一個好處就是對外部提供統一的接口方法,而代理類在接口中實現對真實類的附加操作行為,從而可以在不影響外部調用情況下,進行系統擴展。也就是說,我要修改真實角色的操作的時候,盡量不要修改他,而是在外部在“包”一層進行附加行為,即代理類。
代理模式使用場景
當我們需要使用的對象很復雜或者需要很長時間去構造,這時就可以使用代理模式(Proxy)。例如:如果構建一個對象很耗費時間和計算機資源,代理模式(Proxy)允許我們控制這種情況,直到我們需要使用實際的對象。一個代理(Proxy)通常包含和將要使用的對象同樣的方法,一旦開始使用這個對象,這些方法將通過代理(Proxy)傳遞給實際的對象。 一些可以使用代理模式(Proxy)的情況:
一個對象,比如一幅很大的圖像,需要載入的時間很長。
一個需要很長時間才可以完成的計算結果,並且需要在它計算過程中顯示中間結果
一個存在於遠程計算機上的對象,需要通過網絡載入這個遠程對象則需要很長時間,特別是在網絡傳輸高峰期。
一個對象只有有限的訪問權限,代理模式(Proxy)可以驗證用戶的權限
哈哈哈,本篇結束,未完待續,希望和大家多多交流夠溝通,共同進步(*^__^*) 嘻嘻……