代理模式是為一個對象提供一個代用品或占位符膘婶,以便控制對它的訪問恒水。
保護代理: 控制不同權(quán)限的對象對目標(biāo)對象的訪問倔幼;
虛擬代理: 把一些開銷很大的代理,延遲到真正需要它的時候才去創(chuàng)建修壕;
緩存代理: 可以為一些開銷大的運算結(jié)果提供暫時的存儲愈捅,在下次運算時,如果傳遞進來的參數(shù)與之前一致慈鸠,則可以直接返回前面存儲的運算結(jié)果蓝谨;
防火墻代理: 控制網(wǎng)絡(luò)資源的訪問,保護主題不讓“壞人”接近青团;
遠程代理: 為了一個對象在不同的地址空間提供局部代表像棘,在 Java 中,遠程代理可以是另一個虛擬機的對象壶冒。
智能引用代理:取代了簡單的指針,它在訪問對象時執(zhí)行一些附加操作截歉,比如計算一個對象被引用的次數(shù)胖腾。
寫時復(fù)制代理:通常用于復(fù)制一個龐大對象的情況。寫時復(fù)制代理延遲了復(fù)制的過程,
當(dāng)對象被真正修改時咸作,才對它進行復(fù)制操作锨阿。寫時復(fù)制代理是虛擬代理的一種變體,DLL
(操作系統(tǒng)中的動態(tài)鏈接庫)是其典型運用場景记罚。
Demo:下面重點講一下 JS 中常用的虛擬代理
用途:
- 圖片預(yù)加載墅诡;
- 虛擬代理合并 HTTP 請求;
- 虛擬代理在惰性加載中應(yīng)用桐智。
栗子(圖片預(yù)加載):
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( 'file:// /C:/Users/svenzeng/Desktop/loading.gif' );
img.src = src;
}
}
})();
proxyImage.setSrc( 'http:// imgcache.qq.com/music/photo/k/000GGDys0yA0Nk.jpg' );