这是本人的设计模式学习笔记,把本身学习过程当中的一些总结和认识记录下来,与诸君共勉。本日为你们带来代理模式。ajax
代理的任务是对本体的访问进行控制,并暴露出与本体彻底相同的接口,将全部对它进行的方法调用传递给本体。注意代理既不像装饰者同样添加行为,也不像外观模式同样简化接口,记住:proxy‘s interface = origin’s interface。下面咱们给出代理模式的结构示意图。设计模式
远程代理用于访问位于另外一个环境中的对象,另外一种环境的意义有着普遍的语义,例如在Java中意味着另外一个JVM中得对象。实现远程代理须要有客户端助手也就是代理对象来接受客户的请求并传达给服务端,也要有服务端助手来解析请求。远程对象通常长期存在,下面也给出示意图。远程代理也能够被用来访问其余语言中的对象。缓存
最后,介绍一些术语:安全
虚拟代理用于控制对那种建立开销很大的本体的访问,将本体的实例化推迟到有方法被调用的时候,有时还会提供关于实例化状态的反馈。下面给出一张示意图:服务器
jsproxy.prototype._init=function(){ if(this.entity===null){ this.entity= new Entity(this.data); } };
保护代理一般根据客户身份控制对特定方法的访问。多线程
这里咱们列出一些在上面没有提到的代理:app
先举一个例子,ajax机制中,你想拉取远程资源并进行一些操做,你能够在本地建立代理对象来暴露这些操做接口,而后就像操做本地对象同样完成操做,实际的xhr对象和远程请求等均可以隐藏在代理内部,具体能够参考jQuery的ajax服务。固然每每这种例子不会那么纯粹,它们或多或少带有装饰器、外观模式的种种特色,但它们确实实现了代理的目的,不是吗?异步
再好比搜索框,它们要查询服务器并拉取数据,但你并不是每次访问该页面都使用搜索框啊,使用虚拟代理就能够在用户真的搜索时再请求,固然你会说直接用事件不就得了。可是异步加载的次数和类别够复杂,你可能会但愿仅仅对view暴露接口。虚拟代理总会派上用场。函数
以虚拟代理为例学习
jsvar Proxy=function(){ this.args=arguments; this.initialized=false; this.subject={};//构建的本体 this.class={...};//本体的构造函数 ... var self=this; for(var key in this.class.prototype){ if(typeof this.class.prototype[key] !== "function") continue; (function(methodName){ self[methodName]=function(){ if(!self.initialized) return; return self.subject[methodName].apply(self.subject,arguments); }; })(key); } }; Proxy.prototype._init=function(){...}; Proxy.prototype._checkInitialization=function(){...};//阻止在初始化以前方法被调用 Proxy.prototype._isInitialized=function(){...};