javascript设计模式学习之六——代理模式
2016-07-04 21:14
323 查看
一、代理模式定义
代理模式的关键是:当客户不方便直接访问一个对象或者不满足需要的时候,提供一个替身对象来控制对这个对象的访问。代理模式需要和本体对外提供相同的接口,对用户来说是透明的。代理模式的种类有很多,诸如防火墙代理,保护代理(帮助过滤掉一些请求,控制不同权限的对象对目标对象的访问),虚拟代理(将一些开销很大的对象,延迟到真正需要的时候才创建),缓存代理等。在javascript中使用较多的是虚拟代理。
二、虚拟代理实现图片预加载
在这个例子中,不使用虚拟代理固然也能够解决问题,不过采用虚拟代理之后更好地体现了单一职责原则;
(感觉上面的IETF模块模式也是一种单例,似乎,如果需要多个实例的时候采用基于委托的写法,只需要一个的时候,可以使用单例模式)
三、缓存代理
缓存代理可以为一些开销大的计算提供暂时的存储,或者如ajax分页时候,同一页的数据理论上只需要去后台拉取一次,这些已经拉取过的数据在某个地方缓存之后,下一请求同一页的时候,便可以直接使用之前的数据。
代理模式的关键是:当客户不方便直接访问一个对象或者不满足需要的时候,提供一个替身对象来控制对这个对象的访问。代理模式需要和本体对外提供相同的接口,对用户来说是透明的。代理模式的种类有很多,诸如防火墙代理,保护代理(帮助过滤掉一些请求,控制不同权限的对象对目标对象的访问),虚拟代理(将一些开销很大的对象,延迟到真正需要的时候才创建),缓存代理等。在javascript中使用较多的是虚拟代理。
二、虚拟代理实现图片预加载
在这个例子中,不使用虚拟代理固然也能够解决问题,不过采用虚拟代理之后更好地体现了单一职责原则;
//代理模式实现图片预加载 var myImage=(function(){ var realImg=document.createElement('img'); document.body.appendChild(realImg); return { setSrc:function(src){ realImg.src=src; } }; })(); var proxyImg=(function(){ var img=new Image; img.onload=function(){ //myImage.setSrc(img.src); myImage.setSrc(this.src); } return { serSrc:function(src){ myImage.setSrc("file://c:/users/Desktop/loading.gif"); img.src=src; } }; })(); //调用方式 proxyImg.setSrc('http://imgcache.qq.com/00.jpg');
(感觉上面的IETF模块模式也是一种单例,似乎,如果需要多个实例的时候采用基于委托的写法,只需要一个的时候,可以使用单例模式)
三、缓存代理
缓存代理可以为一些开销大的计算提供暂时的存储,或者如ajax分页时候,同一页的数据理论上只需要去后台拉取一次,这些已经拉取过的数据在某个地方缓存之后,下一请求同一页的时候,便可以直接使用之前的数据。
//为复杂运算实现缓存代理 /*****计算乘积******/ function mult(){ var ret=1; for(var i=0;i<arguments.length;i++){ ret*=arguments[i]; } return ret; } /*****创建缓存代理的工厂*******/ var createProxyFactory=function(fn){ var cache={}; return function(){ var argStr=[].join.call(arguments); if(argStr in cache){ return cache[argStr]; } return cache[argStr]=fn.call(this,arguments); }; }; //调用示例 var mult2=createProxyFactory(mult); mult2(1,2,3);//第一次计算 mult2(1,2,3);//第二次从缓存中读取
相关文章推荐
- JavaScript变量的作用域&是否有var 的区别
- js实现继承的几种方式
- javascript深入理解js闭包
- JSONP实例
- js移除数组中的元素
- Javascript 基本-1
- JavaScript函数调用
- JavaScript网页编程之------数组相关知识
- cropper.js 实现HTML5 裁剪图片并上传(裁剪上传头像。)
- 用js打印直角三角形杨辉三角
- Andriod项目开发实战(2)——JSON和XML的区别
- Javascript之跨浏览器的事件处理程序
- AJAX跨域parsererror报错
- js制作一个简单的div弹窗:
- 前端面试-难点问题2-java和javascript的区别
- JavaScript的大概API
- js回调函数
- JS 处理json 对象或json串
- JSON.stringify()中文乱码
- 转UTF-8为字符串、中文字符串