代理模式
作者: 阿蒙 时间: 2020-2-23 标签: 设计模式 浏览: 2393 评论: 0
定义: 为一个对象提供一个代用品或者占位符,以便控制对它的访问。
保护代理: 过滤掉一些请求,用于控制不同权限的对象对目标目标对象的访问。
虚拟代理:把一些开销很大的对象延迟到真正需要同他的时候才去创建。
缓存代理:为一些开销很大操作提供暂时的存储。
防火墙代理, 远程代理,保护代理, 智能引用代理,写时复制代理等等
虚拟代理作用: 1. 合并请求。 2. 惰性加载
/* 保护代理 */
let Flower = function () {};
let C = {
sendFlower: function (target) {
let flower = new Flower();
target.receiveFlower( flower );
}
};
let B = {
receiveFlower: function ( flower ) {
A.listenGoodMood (function () {
A.receiveFlower( flower );
});
}
};
let A = {
receiveFlower: function ( flower ) {
console.log( '收到花' + flower )
},
listenGoodMood: function (fn) {
setTimeout(function () {
fn();
}, 10000)
}
};
C.sendFlower(B);
/* 虚拟代理 */
let myImage = (function () {
let imgNode = document.createElement("img");
document.body.appendChild(imgNode);
return {
setSrc :function (src) {
imgNode.src = src;
}
}
})();
let proxyImage = (function () {
let img = new Image();
img.onload = function () {
myImage.setSrc(this.src);
};
return {
setSrc: function (src) {
myImage.setSrc('file://本地loading.png');
img.src = src;
}
}
})();
proxyImage.setSrc('http://远程图片.png');
/* 缓存代理 */
let mult = function () {
let a = 0;
for (let i = 0; i < arguments.length; i ++) {
a = a * arguments[i];
}
return a;
};
let plus = function () {
let a = 0;
for (let i = 0; i < arguments.length; i ++) {
a = a + arguments[i];
}
return a;
};
let createPProxyFactory = function (fn) {
let cache = {};
return function () {
let args = Array.prototype.join.call(arguments, ',');
if (args in cache) {
return cache[args];
}
return cache[args] = fn.apply(this, arguments);
}
};
let proxyMult = createPProxyFactory( mult ), proxtPlus = createPProxyFactory( plus );
proxyMult(100, 200, 300);
proxyMult(100, 200, 300);
proxtPlus(100, 200, 300);
proxtPlus(100, 200, 300);
本文相关标签: 设计模式笔记
发表评论: