- 定义
为一个对象提供一个代用品或占位符,以便控制对它的访问 - 关键
当客户不方便直接访问一个对象或者不满足需要的时候,提供一个替身 对象来控制对这个对象的访问,客户实际上访问的是替身对象。替身对象对请求做出一些处理之 后,再把请求转交给本体对象。
保护代理
代理 B 可以帮助 A 过滤掉一些请求,比如送花的人中年龄太大的或者没有宝马的,这种请求就可以直接在代理 B 处被拒绝掉。这种代理叫作保护代理
- 作用
用于控制不同权限的对象对目标对象的访问
虚拟代理
假设现实中的花价格不菲,导致在程序世界里,new Flower 也是一个代价昂贵的操作, 那么我们可以把 new Flower的操作交给代理 B 去执行,代理 B 会选择在 A 心情好时再执行 new Flower
- 作用
把一些开销很大的对象,延迟到 真正需要它的时候才去创建 - 单一职责原则
就一个类(通常也包括对象和函数等)而言,应该仅有一个引起它变 化的原因
缓存代理
缓存代理可以为一些开销大的运算结果提供暂时的存储,在下次运算时,如果传递进来的参数跟之前一致,则可以直接返回前面存储的运算结果。
- 例子-计算乘积
// 先创建一个用于求乘积的函数:
var mult = function(){
console.log( '开始计算乘积' );
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
// 现在加入缓存代理函数
var proxyMult = (function(){
var cache = {};
return function(){
var args = Array.prototype.join.call( arguments, ',' );
if ( args in cache ){
return cache[ args ];
}
return cache[ args ] = mult.apply( this, arguments );
}
})();
proxyMult( 1, 2, 3, 4 ); // 输出:24
proxyMult( 1, 2, 3, 4 ); // 输出:24
// 当我们第二次调用 proxyMult( 1, 2, 3, 4 )的时候, 本体 mult 函数并没有被计算,proxyMult直接返回了之前缓存好的计算结果。
// 通过增加缓存代理的方式,mult 函数可以继续专注于自身的职责——计算乘积,缓存的功能 是由代理对象实现的
防火墙代理
控制网络资源的访问,保护主题不让“坏人”接近
远程代理
为一个对象在不同的地址空间提供局部代表,在 Java 中,远程代理可以是另 一个虚拟机中的对象。
智能引用代理
取代了简单的指针,它在访问对象时执行一些附加操作,比如计算一个
对象被引用的次数。
写时复制代理
通常用于复制一个庞大对象的情况。写时复制代理延迟了复制的过程,
当对象被真正修改时,才对它进行复制操作。写时复制代理是虚拟代理的一种变体,DLL (操作系统中的动态链接库)是其典型运用场景。