第一、定义: 代理模式是为一个对象提供代用品或者占位符,以便控制对它的访问。
比如说,某男生小明想向他的女神 A 表白,刚好小明认识的一个女生B 和 女神A 是好朋友,那么小明就想让 女生B 帮忙送花给 女神A 。
这个就是一个代理模式。
缓存代理模式
var mult = function(){
var a = 1;
for (var i = 0; i < arguments.length; i++) {
a = a*arguments[i]
};
return a;
}
// var result = mult(1,2,3,4);
// console.log(result);
var proxyMult =(function(){
var cache = {};
return function(){
var args = Array.prototype.join.call(arguments,',');
console.log(args) //'1,2,3,4'
if(args in cache){
return cache[args];
}
console.log(cache)
return cache[args] = mult.apply(this,arguments);
}
})();
var result = proxyMult(1,2,3,4);
var result1 = proxyMult(1,2,3,4);
var result2 = proxyMult(1,2,3,4,6);
var result3 = proxyMult(1,2,3);
var result4 = proxyMult(1,2,3,4,6);
console.log(result) //24
console.log(result1) //24
console.log(result2) //144
console.log(result3) //144
console.log(result4) //
//只执行了3次
用代理 - 计算参数的乘积
下面例子定义了一个阶乘函数,他可以将上次的计算结果缓存起来。在函数编程中,这种缓存技巧叫做“记忆” 。
//缓存代理模式
//例如 : f(1,2,3) 必要的时候以空间换时间
//f(1,2,3)
//主要形成 cache {
// 1,23: 24
//}
/**************** 计算乘积 *****************/
var mult = function(){
var a = 1;
for ( var i = 0, l = arguments.length; i < l; i++ ){
a = a * arguments[i];
}
return a;
};
/**************** 计算加和 *****************/
var plus = function(){
var a = 0;
for ( var i = 0, l = arguments.length; i < l; i++ ){
a = a + arguments[i];
}
return a;
};
/**************** 创建缓存代理的工厂 *****************/
var createProxyFactory = function( fn ){
var cache = {};
return function(){
var args = Array.prototype.join.call( arguments, ',' );
if ( args in cache ){
console.log(cache)
return cache[ args ];
}
return cache[ args ] = fn.apply( this, arguments );
}
};
var proxyMult = createProxyFactory( mult ), proxyPlus = createProxyFactory( plus );
console.log ( proxyMult( 1, 2, 3, 4 ) ); // 输出:24
console.log ( proxyMult( 1, 2, 3, 4 ) ); // 输出:24
console.log ( proxyPlus( 1, 2, 3, 4 ) ); // 输出:10
console.log ( proxyPlus( 1, 2, 3, 4 ) ); // 输出:10
console.log ( proxyPlus( 1, 2, 3, 4 ) ); // 输出:10
总结:createProxyFactory ()函数创建一个新的对象,这个对象当作缓存并赋值给一个局部变量,因此对于返回的函数说它是私有的。所返回的函数将它的实参数组转换成字符串,并将参数字符串用作缓存的属性名,如果缓存中存在这个值,则直接返回它!