博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JS代理模式《JavaScript设计模式与开发实践》阅读笔记
阅读量:5991 次
发布时间:2019-06-20

本文共 1635 字,大约阅读时间需要 5 分钟。

代理模式

代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问。

保护代理和虚拟代理

保护代理:当有许多需求要向某对象发出一些请求时,可以设置保护代理,通过一些条件判断对请求进行过滤。

虚拟代理:在程序中可以能有一些代价昂贵的操作。此时可以设置虚拟代理去代为执行,这里的虚拟代理便会在适合的时候(需要用到的时候)才去执行。

保护代理用于控制不同权限的对象对目标对象的访问,但在JavaScript并不容易实现保护代理,因为我们无法判断谁访问了某个对象。而虚拟代理是最常用的一种代理模式。

虚拟代理实现图片预加载

预加载图片在Web开发中十分常用,其通过异步的方式加载图片,利用一张loading图片占位。等图片加载好之后把图片填充到img节点中。

var myImage = (function(){  var imgNode = document.createElement('img')  document.body.appendChild(imgNode)  return {    setSrc: function(src){      imgNode.src = src    }  }})()var proxyImage = (function(){  var img = new Image()  img.onload = function(){    myImage.setSrc(this.src)  }  return {    setSrc: function(src){       myImage.setSrc('loading.gif')      img.src = src    }  }})()proxyImage.setSrc('realImage.jpg')
通过
proxyImage间接的访问了
MyImage
proxyImage控制了客户对
MyImage的访问,并且在此过程中加入了一些额外的操作,比如在真正的图片加载好之前,先把img节点的src设置为一张loading图片。

代理的意义

面向对象设计原则——单一职责原则。单一职责原则指的是,就一个类(通常也包括对象和函数等)而言,应该仅有一个引起它变化的原因。如果一个对象承担了多项职责,就意味着这个对象将变得巨大,引起它变化的原因会有多个。面向对象设计鼓励将行为分布到细粒度的对象之中,如果一个对象承担的职责过多,等于把这些职责耦合到了一起,这种耦合会导致脆弱和低内聚的设计,带变化发生时,设计可能会遭到意外的破坏。

虚拟代理例子中,代理模式给系统添加了额外的功能,预加载图片。而我们实际需要的只是MyImagesetImage方法。预加载只是一个锦上添花的功能。通过代理模式使得这两个功能独立开来,遵循了开放-封闭原则。

缓存代理

缓存代理可以为一些开销大的运算结果提供暂时的存储,在下次运算时,如果传递进来的参数跟之前一致,则可以直接返回前面存储的运算结果。

乘积运算的例子

/*******计算乘积******/var mult = function(){  console.log('开始计算乘积')  var a = 1   for (var i = 0,l = arguments.length;i

最后

虽然代理模式非常有用,但我们在编写业务代码的时候,往往不需要去预先猜测是否需要使用代理模式。当真正发现不方便直接访问某个对象的时候,再编写代理不迟。

代理模式是一种很实用的设计模式,很好的诠释了面向对象中的单一职责原则和开放-封闭原则。在实际开发的时候往往会迫于进度压力或者实现了再说的态度忽略了一些必要的代码的可维护性,我觉得在一些简单的地方去试着遵循一些设计理念是对自己代码能力的提升。当然不要为了设计而设计啦。

Done is better then Perfect

参考

《JavaScript设计模式与开发实践》—— 曾探

转载地址:http://spnlx.baihongyu.com/

你可能感兴趣的文章
制作Windows XP万能克隆镜像
查看>>
WebStorm: The Smartest JavaScript IDE by JetBrains
查看>>
炮灰模型——女生选择追求者模型
查看>>
C# System.IO.FileStream 文件正由另一进程使用,因此该进程无法访问该文件
查看>>
解决vim粘贴时格式混乱的问题
查看>>
vue-cli3 项目从搭建优化到docker部署
查看>>
95. Unique Binary Search Trees II
查看>>
前后分离的总结
查看>>
TIOBE 2 月排行榜:时隔 3 年,Groovy 重进 TOP 20
查看>>
Distributed Systems-一致性协议背景介绍及Paxos算法的推导
查看>>
Python Logging库HTTPHandler的消息格式化的方法
查看>>
[Unity3d]Unity Mathf 数学运算(C#)
查看>>
Python基础教程:Day15-图像和办公文档处理
查看>>
Bytom设计结构解读
查看>>
java实现FTP多线程断点续传,上传下载
查看>>
突破瓶颈,对比学习:Eclipse开发环境与VS开发环境的调试对比
查看>>
同步与异步&阻塞与非阻塞-各种解释
查看>>
Android中如何查看内存(上)
查看>>
Jersey2.x框架搭建简单的Restful API
查看>>
Hadoop的实现原理及基本使用方法
查看>>