1、特点
代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问。代理模式是一种非常有意义的模式,在生活中可以找到很多代理模式的场景。比如,明星都有经纪人作为代理。如果想请明星来办一场商业演出,只能联系他的经纪人。经纪人会把商业演
出的细节和报酬都谈好之后,再把合同交给明星签。
2、demo
小明送花
var Flower = function() {};
var xiaoming = {
sendFlower: function(target) {
var flower = new Flower();
target.receiveFlower(flower);
}
};
var A = {
receiveFlower: function(flower) {
console.log('收到花' + flower);
}
};
var B = {
receiveFlower: function(flower) {
A.receiveFlower(flower);
}
};
xiaoming.sendFlower(B);
图片加载
//图片加载
var myImage = (function() {
var imgNode = document.createElement('img');
document.body.appendChild(imgNode);
return {
setSrc: function(src) {
imgNode.src = src;
}
}
})();
var proxyImage = (function() {
var img = new Image;
img.onload = function() {
myImage.setSrc(this.src);
}
return {
setSrc: function(src) {
myImage.setSrc('.../loading.gif');
}
}
})();
proxyImage.setSrc('../aa.jpg');
缓存代理
var mult = function() {
console.log('开始计算乘积');
var a = 1;
for (var i = 0, l = arguments.length; i < l; i++) {
a = a * arguments[i];
}
return a;
};
// 当我们第二次调用proxyMult( 1, 2, 3, 4 )的时候,本体mult 函数并没有被计算,proxyMult
// 直接返回了之前缓存好的计算结果。
// 通过增加缓存代理的方式,mult 函数可以继续专注于自身的职责——计算乘积,缓存的功能
// 是由代理对象实现的。
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
参考文献:参考文献:《JavaScript设计模式与开发实践》