代理模式是指一個對象提供一個代用品或者占位符膳叨,以便控制對它的訪問运吓。比如明星都有經紀人等团秽。 在js中常用的代理模式有虛擬代理和緩存代理。
虛擬代理的基本思想是把一些開銷很大的對象晦譬,延遲到真正需要的時候采取創(chuàng)建疤苹。舉一個圖片預加載的例子,來看一下虛擬代理的使用:
// 最簡單的圖片加載方案
var myImage = function(){
var imgNode = document.createElement("img");
document.appendChild(imgNode);
return {
setSrc: function(src){
imgNode.src = src;
}
}
}
上述實現(xiàn)方式敛腌,一個最簡單的場景是:網速很慢時卧土,圖片空白的時間很長 ,為此我們引入一個占位默認圖片像樊,使用代理方式進行實現(xiàn):
// myImage采用上述定義..
// 使用代理
var proxyImage = funciton(){
var img = new Image();
img.onload = function(){
myImage.setSrc(img.src);
}
return {
setSrc: function( src ){
myImage.setSrc("loading.gif");
img.src = src;
}
}
}
proxyImage.setSrc("show.jpg");
為了對比尤莺,我們看下不進行代理的實現(xiàn)方式:
// 不使用代理
var myImage = (function(){
var imgNode = document.createElement("img");
document.body.appendChild(imgNode);
var img = new Image();
img.onload = function(){
imgNode.src = img.src;
}
return {
seteSrc: function( src ){
myImage.setSrc("loading.gif");
img.src = src;
}
}
})();
myImage.setSrc("show.jpg");
對比上面兩個例子,一個不采用代理生棍,一個采用代理模式颤霎;或許感覺使用代理模式有點自找麻煩。 我們給出一個假設涂滴,因為網絡條件好友酱,不采用預加載了(當然有點不現(xiàn)實),那么使用代理模式的情況柔纵,只需拿掉代理模式就ok了粹污,但是不使用代理模式的情況,需要對其內部邏輯進行修改首量。
從程序開發(fā)設計的角度上來說壮吩,在面向對象的開發(fā)者进苍,我們要遵循一個原則:“單一職責原則”。一個對象承載的職責過多鸭叙,那就意味著把這些職責耦合在一起觉啊,從而造成高耦合低內聚的設計。
緩存代理的基本思想是空間換速度沈贝。如一個復雜的運算杠人,我們把以前計算過的數(shù)值存下來,如果下次用到宋下,那么就可以省去了復雜的計算而直接從緩存中獲得到結果嗡善; 還有一些分頁的設計,可以把打開過的頁面數(shù)據(jù)存下來学歧,下次進入就可以不要發(fā)送請求了罩引。