代理模式是給對(duì)象提供一個(gè)代用品或占位符沦辙,以便控制對(duì)它的訪問(wèn)
參考《javascript模式設(shè)計(jì)與開(kāi)發(fā)實(shí)踐》
緩存代理
緩存代理可以為一些開(kāi)銷比較大的運(yùn)算結(jié)果提供暫時(shí)的存儲(chǔ)胁塞,下一次運(yùn)算時(shí)如果傳遞參數(shù)和緩存的參數(shù)一致嘁圈,則可是直接返回前面存儲(chǔ)的運(yùn)算結(jié)果
計(jì)算乘積的實(shí)例
var mult = function(){ //默認(rèn)傳遞的arguments參數(shù)列表
console.log( '開(kāi)始計(jì)算乘積' );
var a = 1;
for ( var i = 0, l = arguments.length; i < l; i++ ){
a = a * arguments[i];
}
return a;
};
mult( 2, 3 ); // 輸出:6
mult( 2, 3, 4 ); // 輸出:24
//現(xiàn)在加入緩存代理函數(shù):
var proxyMult = (function(){
var cache = {}; //緩存對(duì)象
return function(){
var args = Array.prototype.join.call( arguments, ',' );
if ( args in cache ){ //如果合并的參數(shù)在緩存中
return cache[ args ]; //直接分會(huì)緩存數(shù)據(jù)
}
return cache[ args ] = mult.apply( this, arguments );
//調(diào)用函數(shù)之后存儲(chǔ)到緩存對(duì)象中
}
})();
proxyMult( 1, 2, 3, 4 ); // 輸出:24 //第一次計(jì)算
proxyMult( 1, 2, 3, 4 ); // 輸出:24 //第二次計(jì)算寇仓,直接存緩存中獲取
//這里的兩個(gè)函數(shù)橱赠,multi負(fù)責(zé)計(jì)算,proxyMulti負(fù)責(zé)緩存的存儲(chǔ)和讀取蕉世。
//兩個(gè)函數(shù)分功能完成對(duì)應(yīng)的功能