虚拟代理实现图片预加载


在web开发中,图片预加载是一种很常用的技术。

如果给一个img标签节点设置src属性,图片体积过大,或者网路不佳的情况下,往往会有比较长时间的空白,体验不好。

556D0667-BD7C-4B27-BA16-74D05067DEE8.png

常见的做法是先用一张loading图占位,然后异步的方式加载图片。等图片加载好了再填充到img节点里。

<pre>
var myImage = (function(){

var imgNode = document.createElement('img');
document.body.appendChild(imgNode) ;
var img = new Image ;
img.onload = function() {
imgNode.src = img.src ;
}
return { setSrc : function(src){
imgNode.src = '../testImages/7.jpg' ; }
}})();
myImage.setSrc('../testImages/7.jpg');

</pre>

上面的一段代码,myImage 对象 除了负责给img节点 设置src,还要负责预加载图片。
在面向对象设计中,如果一个对象承担了多项职责,就意味着这个对象可能会变的巨大。//我就见到过一个函数好几百行。。。

面向对象设计 鼓励把行为分开,分散为更细粒度的对象之中。
原因显而易见,如果一个对象承担的职责过多,耦合性会很高,这种耦合会导致脆弱和低内聚的设计,容易发生意外。

现在回到代码中去, 如果我们只是加载体积不大的图,若干年后网络足够快,我们不在需要预加载了,要想把这段代码删掉,这时候就不得不改动myimage对象了。

实际上,我们需要做的只是给img 设置src,如果能把这个操作放到另一个对象中去操作,那当然是极好的。
下面我们重构一下这段代码:

<pre>
var myImage = (function(){
var imageNode = document.createElement('img');
document.body.appendChild(imageNode) ;
return {
setSrc : function(src){
imageNode.src = src ;
}
}})();

var proxyImage = (function(){
var img = new Image;
img.onload = function(){
myImage.setSrc( this.src);
}
return {
setSrc : function (src){
myImage.setSrc('../testImages/loading.gif');
img.src = src ;
}
}})();

proxyImage.setSrc('../testImages/1.jpg');
</pre>

现在我们通过proxyImage间接的访问myImage。
proxyImage控制了客户对myImage 的访问,而且在这个过程中还能加入一些其他的操作,比如图片加载完成之前,显示loading图,体验会好一些。

小结:
通过代理对象,添加了新的行为,符合开放-封闭 原则。
给img 节点设置src 和图片 预加载这两个功能被隔离开到两个对象里,
他们可以各自变化 而不影响到另一个,这个是很重要的。
况且,加入有一天我们不需要这个预加载了,那只需要改变请求体 而不是请求代理对象就好了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,910评论 2 17
  • 代理是一个对象,它可以用来控制对本体对象的访问,它与本体对象实现了同样的接口,代理对象会把所有的调用方法传递给本体...
    JSUED阅读 319评论 0 0
  • 代理模式 代理是一个对象,它可以用来控制对本体对象的访问,它与本体对象实现了同样的接口,代理对象会把所有的调用方法...
    尘中老阅读 369评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,049评论 19 139
  • 周末小木夕给我打电话说要约我吃火锅,我心想这家伙平时可是大门不出二门不迈的,今天怎么想起来要请我吃饭了。我赶紧把自...
    一个很丧的友人A阅读 362评论 0 0