Javascript 设计模式(3) —— 代理模式

第一、定义: 代理模式是为一个对象提供代用品或者占位符,以便控制对它的访问。
比如说,某男生小明想向他的女神 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 ()函数创建一个新的对象,这个对象当作缓存并赋值给一个局部变量,因此对于返回的函数说它是私有的。所返回的函数将它的实参数组转换成字符串,并将参数字符串用作缓存的属性名,如果缓存中存在这个值,则直接返回它!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值