最近在研读曾探大佬的著作《JavaScript设计模式与开发实践》——代理模式,并做了如下读书笔记总结和个人理解。
代理模式
定义:为一个对象提供一个代用品或占位符,以便控制对它的访问。
代理模式关键:当客户不方便直接访问一个对象或者不满足需要的时候,提供一个替身对象来控制对这个对象的访问,客户实际上访问的是替身对象。替身对象对请求做出一些处理之后,再把请求转交给本体对象。
保护代理:
- 通俗来讲,如果用户想要追求A,并想送花给A,他没有直接用给A,而是通过B的手去把花送给A。这样B就可以过滤掉一些请求,如送花的人年龄大或者没有宝马。这种请求直接在代理B处被拒绝掉,叫做保护代理。
虚拟代理:
- 通俗来讲,如果用户想要追求A,并想送花给A,他没有直接用给A,而是通过B的手去把花送给A。B会选择在A心情好的时候再送花,这样成功的概率就增大了。这种代理模式就是虚拟代理,它会把一些开销很大的对象,延迟到真正需要它的时候才去创建。
虚拟代理实现图片预加载
背景:在Web开发中,如果直接给某个img标签节点设置src属性,由于图片过大或者网络不佳,图片的位置往往有段时间会是一片空白。常见的做法就是先用一张loading图片占位,然后用异步的方式加载图片,等图片加载好了再把它填充到img节点里,该场景就很适合使用虚拟代理。
其他代理模式
防火墙代理:控制网络资源的访问,保护主题不让“坏人”接近。
远程代理:为一个对象在不同的地址空间提供局部代表,在Java中,远程代理可以是另一个虚拟机中的对象。
保护代理:用于对象应该有不同访问权限的情况。
智能引用代理:取代了简单的指针,它在访问对象时执行一些附加操作,比如计算一个对象被引用的次数。
写时复制代理:通常用于复制一个庞大对象的情况。写时复制代理延迟了复制的过程,当对象被真正修改时,才对它进行复制操作。写时复制代理是虚拟代理的一种变体,DLL(操作系统中的动态链接库)是其典型运行场景。
参考文章:JavaScript设计模式与开发实践