[TOC] >[success] # 什么是代理模式 (菜鸟教程中代理模式总结) ~~~ 1.定义在代理模式(Proxy Pattern)中,'一个类代表另一个类的功能', '为其他对象提供一种代理以控制对这个对象的访问' 2.代理模式由两部分构成:当一个类不方便直接访问或者不满足需求的时候, 需要提供一个替身对象来控制这个对象的访问,替身对象作出一些处理之后 ,在把请求转交给本体对象。'第一部分本体对象','第二部分是替身对象', '替身对象的主要作用是作出一些处理,当处理合适的部分在交给实体对象处理' 3.主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。 在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制, 或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对 象时加上一个对此对象的访问层。 何时使用:想在访问一个类时做一些控制。 如何解决:增加中间层(指的就是替身对象)。 ~~~ >[danger] ##### 优缺点 * 优点 ~~~ 1、职责清晰。 2、高扩展性。 3、智能化。 ~~~ * 缺点 ~~~ 1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的 处理速度变慢。 2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。 ~~~ >[success] # 前端的代理模式 ~~~ 1简单的来讲本地对象注重的去执行,页面上的代码,代理则控制本地对象何时被实例化,何时被使用 '通俗讲想访问一个类,需要通过另一个类来间接访问 ' 2.引用书中的解释:'代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问。' ~~~ >[info] ## 举个书中例子 -- 追对象 ~~~ 1.书中举个了小明追对象的故事来形容代理模式,简单的讲,一般我们如果去跟另一个人表白,无非两种 情况,第一中自己上直接开口表白,第二种找个两方的熟人让其帮忙'牵线搭桥'(这个人就是代理) ~~~ >[danger] 不用代理直接上去表白的代码 ~~~ var Flower = function () {} var xiaoming = { sendFlower:function (target) { var flower = new Flower() // 表白给目标对象送花 target.receiveFlower(flower) } } var nvshen = { receiveFlower:function (flower) { console.log(flower) } } xiaoming.sendFlower(nvshen) ~~~ >[danger] 直接上失败了,我要找人帮忙 ~~~ 1.熟人帮忙给花 顺序就是 : 你把花给 =》 你的朋友(你的朋友有个接受花的动作)=》你的朋友在把花给女神(女神有个接花的动作) 2.根据上面的代理模式构成:'第一部分本体对象','第二部分是替身对象', '替身对象的主要作用是作出一些处理,当处理合适的部分在交给实体对象处理' 代理模式定义:'一个类代表另一个类的功能','为其他对象提供一种代理以控制对这个对象的访问' 2.1.根据构成来分析下面代码: 下面代码针对上面说的第一部分是'女神也就是对象本体',第二部分'共同的对象也就是替身' ,'共同的朋友在合适的情况下把花给了女神'。 2.2.根据定义来分析: '女神和共同的朋友都有收花的功能,朋友这个对象带表女神这个对象收花,在通过某种方式把花给女神' 通俗的讲女神和朋友都有'receiveFlower'方法,我调用朋友的让朋友的方法调用女神的 ~~~ ~~~ var Flower = function () {} var xiaoming = { sendFlower:function (target) { var flower = new Flower() // 表白给目标对象送花 target.receiveFlower(flower) } } // 共同的朋友 var mutualFriend = { receiveFlower:function (flower) { // 直接把小明给的花,转手给女神 nvshen.receiveFlower(flower) } } // 本体 var nvshen = { receiveFlower:function (flower) { console.log(flower) } } xiaoming.sendFlower(mutualFriend) ~~~ >[danger] ##### 为了让追到女神的成功率提高 ~~~ 1.你的好朋友为了让你更加容易的追到女神,他每天观察女神心情好坏,有一天 发现女神心情特别好,你的朋友把你把花给你的女神,哇恭喜你和女神在一起了 2.下面的例子可以看出代理不仅仅向之前隔手传递的感觉,他可以帮监听本体 在特定的时候传递给本体吗,这只是代理其中一个点后续会详细讲更多代理应用, 现在需要有个印象 ~~~ ~~~ var Flower = function(){}; var xiaoming = { sendFlower: function( target){ var flower = new Flower(); target.receiveFlower( flower ); } }; var B = { receiveFlower: function( flower ){ A.listenGoodMood(function(){ A.receiveFlower( flower ); }); } }; var A = { receiveFlower: function( flower ){ // 监听 A 的好心情 console.log( '收到花 ' + flower ); }, listenGoodMood: function( fn ){ setTimeout(function(){ // 假设 10 秒之后 A 的心情变好 fn(); }, 10000 ); } }; xiaoming.sendFlower( B ); ~~~