代理模式
作者: 阿蒙 时间: 2020-2-23 标签: 设计模式 浏览: 1680 评论: 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);
本文相关标签: 设计模式笔记
发表评论: