javascript设计模式学习之六——代理模式
一、代理模式定义
代理模式的关键是:当客户不方便直接访问一个对象或者不满足需要的时候,提供一个替身对象来控制对这个对象的访问。代理模式需要和本体对外提供相同的接口,对用户来说是透明的。代理模式的种类有很多,诸如防火墙代理,保护代理(帮助过滤掉一些请求,控制不同权限的对象对目标对象的访问),虚拟代理(将一些开销很大的对象,延迟到真正需要的时候才创建),缓存代理等。在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=;
for(var i=;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(,,);//第一次计算
mult2(,,);//第二次从缓存中读取
javascript设计模式学习之六——代理模式的更多相关文章
- 【读书笔记】读《JavaScript设计模式》之代理模式
一.定义 代理是一个对象,它可以用来控制对另一个对象的访问.它与另外那个对象实现了同样的接口,并且会把任何方法调用传递给那个对象.另外那个对象通常称为本体.代理可以代替其实体被实例化,并使其可被远程访 ...
- javascript设计模式实践之代理模式--图片预加载
图片的预加载就是在加载大图片前,先显示一个loading.gif,就算在网络比较慢的时候也能让人知道正在加载,总比啥反应都没有强. 下面这段代码就是预加载的一个简单的实现,假设先不处理加载图片时的on ...
- 设计模式学习心得<代理模式 Proxy>
在代理模式(Proxy Pattern)中,一个类代表另一个类的功能.这种类型的设计模式属于结构型模式. 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口. 概述 意图 为其他对象提供 ...
- Java设计模式学习记录-代理模式
代理模式 代理模式是常见设计模式的一种,代理模式的定义是:为其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起 ...
- 设计模式学习之代理模式(Proxy,结构型模式)(11)
参考地址:http://www.cnblogs.com/zhili/p/ProxyPattern.html 一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访 ...
- 设计模式学习之代理模式(Proxy)
一.代理模式的初衷 不想让客户端直接访问具体实现接口,客户端不应该直接访问具体实现,一般会涉及到以下四个对象 业务接口:定义客户端访问的接口,是实现类和代理类都需要实现的 实现类:实现了业务接口,真正 ...
- javascript设计模式学习之五——策略模式
一.策略模式定义: 定义一些列的算法/规则,将它们封装起来,使得它们可以互相替换/组合使用.其目的在于将算法/规则封装起来,将算法/规则的使用与实现分离出来. 通过策略模式,可以减少算法计算过程中大量 ...
- Java-马士兵设计模式学习笔记-代理模式-聚合与继承方式比较
一.概述 1.目标:要在Tank的move()方法做时间代理及日志代理(可以设想以后还要增加很多代理处理),且代理间的顺序可活更换 2.思路: (1)聚合:代理类聚合了被代理类,且代理类及被代理类都实 ...
- Java-马士兵设计模式学习笔记-代理模式-动态代理 调用Proxy.newProxyInstance()
一.概述 1.目标:不自己写代理类,利用Proxy.newProxyInstance()动态生成 2.用到的知识点: (1)//编译源码,生成class,注意编译环境要换成jdk才有compiler, ...
随机推荐
- IntelliJ IDEA(社区版)学习记录
一.下载 地址:官网下载地址 二.安装 运行安装程序,一路下一步.注意选择安装路径. 三.基本概念 project:相当于donet下的解决方案 module:相当于donet下的项目工程 四.IDE ...
- SqlServer表数据与excel中数据的互相复制
一.SqlServer表数据复制到excel 1.新建查询,用sql语句把表数据读出来 2.然后,选择数据,右键,复制(也可以点击连同标题复制),复制到记事本中(不然会乱码) 3.然后再把记事本的内容 ...
- Apache Storm技术实战之3 -- TridentWordCount
欢迎转载,转载请注明出处. 介绍TridentTopology的使用,重点分析newDRPCStream和stateQuery的实现机理. 使用TridentTopology进行数据处理的时候,经常会 ...
- web-content和web-info目录问题
1.资源文件只能放在WebContent下面,如 CSS,JS,image等.放在WEB-INF下引用不了. 2.页面放在WEB-INF目录下面,这样可以限制访问,提高安全性.如JSP,html 3. ...
- fleetctl --help
NAME: fleetctl - fleetctl is a command-line interface to fleet, the cluster-wide CoreOS init syst ...
- PHPStorm下XDebug配置
PHPStorm下XDebug配置 分类: PHP2013-08-11 22:15 19697人阅读 评论(0) 收藏 举报 目录(?)[+] 1安装Xdebug 用yum安装可能会失败,用p ...
- MySQL binlog-do-db选项是危险的
很多人通过 binlog-do-db, binlog-ignore-db, replicate-do-db 和 replicate-ignore-db 来过滤复制(某些数据库), 尽管有些使用, ...
- PHP实例练习--投票和租房子
一,调查问卷 效果图:
- 大话数据结构(十二)java程序——KMP算法及改进的KMP算法实现
1.朴素的模式匹配算法 朴素的模式匹配算法:就是对主串的每个字符作为子串开头,与要连接的字符串进行匹配.对主串做大循环,每个字符开头做T的长度的小循环,直到成功匹配或全部遍历完成为止. 又称BF算法 ...
- corresponding SQLSTATE values general error
http://dev.mysql.com/doc/refman/5.7/en/error-messages-server.html B.3 Server Error Codes and Message ...