分类
保护代理
代理B可以帮助A过滤掉一些请求,可以直接在代理B中拒绝掉
用于控制不同权限的对象对目标对象的访问
虚拟代理
把一些开销很大的对象,延迟到真正需要它的时候才去创建
单一职责原则
就一个类(通常也包括对象和函数)而言,应该仅有一个引起它变化的原因。
主要思想
A想调用C,要经过B,B在中间做C的代理,用于判断什么时候可以执行C
比如多次调用缓存起来再一起执行C;传入相同参数只计算一次,将结果保存,以后传入相同参数直接返回结果,不再计算
用途/实现
1.虚拟代理合并 HTTP请求1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29//可以通过一个代理函数 proxySynchronousFile 来收集一段时间之内的请求, 后一次性发送给服务器。
var synchronousFile = function( id ){     
    console.log( '开始同步文件,id 为: ' + id ); 
}; 
 
var proxySynchronousFile = (function(){     
    var cache = [],    // 保存一段时间内需要同步的 ID         
    timer;    // 定时器 
    return function( id ){         
        cache.push( id );  //每次进来收集       
        if ( timer ){    
            // 保证不会覆盖已经启动的定时器             
            return;         
        } 
        timer = setTimeout(function(){             
            synchronousFile( cache.join( ',' ) );    // 2 秒后向本体发送需要同步的 ID 集合 到时间统一处理           clearTimeout( timer );    // 清空定时器             
            timer = null;             
            cache.length = 0; // 清空 ID 集合         
            }, 2000 );     
        } 
    })(); 
var checkbox = document.getElementsByTagName( 'input' ); 
for ( var i = 0, c; c = checkbox[ i++ ]; ){ 
     c.onclick = function(){         
        if ( this.checked === true ){             
            proxySynchronousFile( this.id );         
        }     
    } 
};
2.缓存代理1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22var mult = function(){     
    console.log( '开始计算乘积' );     
    var a = 1;     
    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 ){             
            return cache[ args ];         
            }         
        return  cache[ args ] = fn.apply( this, arguments );     
    } 
}; 
var proxyMult = createProxyFactory( mult ), 
 proxyMult( 1, 2, 3, 4 );    // 输出:24  
 proxyMult( 1, 2, 3, 4 );    // 输出:24
扩展:用于ajax异步请求数据,下次请求相同数据时,是否可以取消请求,直接用之前缓存的数据,适用固定数据