游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

前端必须懂的设计模式代理模式

  动机由于一个对象不想或者不能直接引用另外一个对象,所以需要通过通过一个称之为代理的第三者来实现间接引用代理模式就是为目标对象创造一个代理对象,在客户端和目标对象之间起到中介的作用这样就可以在代理对象里增加一些逻辑判断、调用前或调用后执行一些操作,从而实现了扩展目标的功能并且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务
  通过引入一个新的对象(如小图片和远程代理对象)来实现对真实对象的操作或者将新的对象作为真实对象的一个替身,这种实现机制即为代理模式,通过引入代理对象来间接访问一个对象,这就是代理模式的模式动机。定义
  代理模式(ProxyPattern):给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式的英文叫做Proxy或Surrogate,它是一种对象结构型模式。生活中的案例:
  火车票代购、房产中介、律师、海外代购、明星经纪人类图和时序图
  代理模式包含如下角色:Subject:抽象主题角色Proxy:代理主题角色RealSubject:真实主题角色类图
  时序图
  一个例子明星经纪人
  abstractclassStar{abstractanswerPhone():void;}classAngelababyextendsStar{publicavailable:booleantrue;answerPhone():void{console。log(你好,我是Angelababy。);}}classAngelababyAgentextendsStar{constructor(privateangelababy:Angelababy){super();}answerPhone():void{console。log(你好,我是Angelababy的经纪人。);if(this。angelababy。available){this。angelababy。answerPhone();}}}letangelababyAgentnewAngelababyAgent(newAngelababy());angelababyAgent。answerPhone();场景事件委托代理事件捕获指的是从document到触发事件的那个节点,即自上而下地去触发事件事件冒泡是自下而上地去触发事件绑定事件方法的第三个参数,就是控制事件触发顺序是否为事件捕获。true为事件捕获;false为事件冒泡,默认false。
  bodyulidlistli1lili2lili3liulbody虚拟代理(图片预加载)app。jsletexpressrequire(express);letpathrequire(path)letappexpress();app。get(imagesloading。gif,function(req,res){res。sendFile(path。join(dirname,req。path));});app。get(images:name,function(req,res){setTimeout((){res。sendFile(path。join(dirname,req。path));},2000);});app。get(,function(req,res){res。sendFile(path。resolve(index。html));});app。listen(8080);index。html!DOCTYPEhtmlhtmllangenheadmetacharsetUTF8metanameviewportcontentwidthdevicewidth,initialscale1。0metahttpequivXUACompatiblecontentieedgetitleDocumenttitlestyle。bgcontainer{width:600px;height:400px;margin:100pxauto;}。bgcontainerbgimage{width:100;height:100;}styleheadbodybuttondatasrcimg02。bs178。combkghfc2d0dabef675ea7。jpg背景1buttonbuttondatasrcimg02。bs178。combkgh74d38974bcfa2664。jpg背景2buttonimgidbgimagesrca2020imgdataimg。jpgdatasrcimg02。bs178。combkghfc2d0dabef675ea7。jpgbodyhtml虚拟代理(图片懒加载)当前可视区域的高度window。innerHeightdocument。documentElement。clientHeight元素距离可视区域顶部的高度getBoundingClientRect()。topgetBoundingClientRectDOMRect对象包含了一组用于描述边框的只读属性left、top、right和bottom,单位为像素。除了width和height外的属性都是相对于视口的左上角位置而言的!DOCTYPEhtmlhtmllangenheadmetacharsetUTF8metanameviewportcontentwidthdevicewidth,initialscale1。0metahttpequivXUACompatiblecontentieedgetitleLazyLoadtitlestyle。image{width:300px;height:200px;backgroundcolor:CCC;}。imageimg{width:100;height:100;}styleheadbodyimgdatasrcimg02。bs178。combkghfc2d0dabef675ea7。jpgimgdatasrcimg02。bs178。combkgh74d38974bcfa2664。jpgimgdatasrcimg02。bs178。combkghfc2d0dabef675ea7。jpgimgdatasrcimg02。bs178。combkgh74d38974bcfa2664。jpgimgdatasrcimg02。bs178。combkghfc2d0dabef675ea7。jpgimgdatasrcimg02。bs178。combkgh74d38974bcfa2664。jpgimgdatasrcimg02。bs178。combkghfc2d0dabef675ea7。jpgimgdatasrcimg02。bs178。combkgh74d38974bcfa2664。jpgimgdatasrcimg02。bs178。combkghfc2d0dabef675ea7。jpgimgdatasrcimg02。bs178。combkgh74d38974bcfa2664。jpgbodyhtml缓存代理
  有些时候可以用空间换时间正整数的阶乘(factorial)
  一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1constfactorialfunctionf(num){if(num1){return1;}else{return(numf(num1));}}constproxyfunction(fn){constcache{};缓存对象returnfunction(num){if(numincache){returncache〔num〕;使用缓存代理}returncache〔num〕fn。call(this,num);}}constproxyFactorialproxy(factorial);console。log(proxyFactorial(5));console。log(proxyFactorial(5));console。log(proxyFactorial(5));斐波那契数列(Fibonaccisequence)
  指的是这样一个数列:1、1、2、3、5、8、13、21、34。在数学上,斐波那契数列以如下被以递推的方法定义:F(1)1,F(2)1,F(n)F(n1)F(n2)(n3,nN)letcount0;functionfib(n){count;returnn2?1:fib(n1)fib(n2);}varresultfib(10);console。log(result,count);55110letcount0;constfibWithCache(function(){letcache{};functionfib(n){count;if(cache〔n〕){returncache〔n〕;}letresultn2?1:fib(n1)fib(n2);cache〔n〕result;returnresult;}returnfib;})();varresultfibWithCache(10);console。log(result,count);5517防抖代理通过防抖代理优化可以把多次请求合并为一次,提高性能节流与防抖都是为了减少频繁触发事件回调节流(Throttle)是在某段时间内不管触发了多少次回调都只认第一个,并在第一次结束后执行回调防抖(Debounce)就是在某段时间不管触发了多少回调都只看最后一个节流!DOCTYPEhtmlhtmllangenheadmetacharsetUTF8metanameviewportcontentwidthdevicewidth,initialscale1。0metahttpequivXUACompatiblecontentieedgetitleDocumenttitlestylecontainer{width:200px;height:400px;border:1pxsolidred;overflow:auto;}container。content{height:4000px;}styleheadbodybodyhtml防抖!DOCTYPEhtmlhtmllangenheadmetacharsetUTF8metanameviewportcontentwidthdevicewidth,initialscale1。0metahttpequivXUACompatiblecontentieedgetitleDocumenttitlestylecontainer{width:200px;height:400px;border:1pxsolidred;overflow:auto;}container。content{height:4000px;}styleheadbodybodyhtml防抖案例未防抖bodyulidtodosulbody
  app。jsletexpressrequire(express);letappexpress();app。use(express。static(dirname));lettodos〔{id:1,text:a,completed:false},{id:2,text:b,completed:false},{id:3,text:c,completed:false},〕;app。get(todos,function(req,res){res。json(todos);});app。get(toggle:id,function(req,res){letidreq。params。id;todostodos。map(item{if(item。idid){item。completed!item。completed;}returnitem;});res。json({code:0});});app。listen(8080);防抖案例防抖
  todos。htmlbodyulidtodosul
  app。jsapp。get(toggle:ids,function(req,res){letidsreq。params。ids;idsids。split(,)。map(itemparseInt(item));todostodos。map(item{if(ids。includes(item。id)){item。completed!item。completed;}returnitem;});res。json({code:0});});代理跨域正向代理正向代理的对象是客户端,服务器端看不到真正的客户端通过公司代理服务器上网
  反向代理反向代理的对象的服务端,客户端看不到真正的服务端nginx代理应用服务器
  proxyserver。jsconsthttprequire(http);consthttpProxyrequire(httpproxy);创建一个代理服务constproxyhttpProxy。createProxyServer();创建http服务器并监听8888端口letserverhttp。createServer(function(req,res){将用户的请求转发到本地9999端口上proxy。web(req,res,{target:http:127。0。0。1:9999});监听代理服务错误proxy。on(error,function(err){console。log(err);});});server。listen(8888,0。0。0。0);
  realserver。jsconsthttprequire(http);letserverhttp。createServer(function(req,res){res。end(9999);});server。listen(9999,0。0。0。0);代理跨域nginx代理跨域webpackdevserver代理跨域客户端代理跨域当前的服务启动在origin(3000端口)上,但是调用的接口在target(4000端口)上postMessage方法可以安全地实现跨源通信otherWindow:其他窗口的一个引用message:将要发送到其他window的数据message将要发送到其他window的数据targetOrigin通过窗口的origin属性来指定哪些窗口能接收到消息事件,其值可以是字符串(表示无限制)或者一个URIotherWindow。postMessage(message,targetOrigin,〔transfer〕);data从其他window中传递过来的对象origin调用postMessage时消息发送方窗口的originsource对发送消息的窗口对象的引用window。addEventListener(message,receiveMessage,false);
  origin。jsletexpressrequire(express);letappexpress();app。use(express。static(dirname));app。listen(3000);
  target。jsletexpressrequire(express);letappexpress();letbodyParserrequire(bodyparser);app。use(bodyParser。urlencoded({extended:true}));app。use(express。static(dirname));letusers〔〕;app。post(register,function(req,res){letbodyreq。body;lettargetbody。target;letcallbackbody。callback;letusernamebody。username;letpasswordbody。password;letuser{username,password};letidusers。length0?1:users〔users。length1〕。id1;user。idid;users。push(user);res。status(302);res。header(Location,{target}?callback{callback}args{id});res。end();});app。listen(4000);
  reg。html!DOCTYPEhtmlhtmllangenheadmetacharsetUTF8metanameviewportcontentwidthdevicewidth,initialscale1。0metahttpequivXUACompatiblecontentieedgetitleDocumenttitleheadbodybodyhtml
  target。html!DOCTYPEhtmlhtmllangenheadmetacharsetUTF8metanameviewportcontentwidthdevicewidth,initialscale1。0metahttpequivXUACompatiblecontentieedgetitleDocumenttitleheadbodybodyhtml。proxy接受一个函数,然后返回一个新函数,并且这个新函数始终保持了特定的上下文语境。jQuery。proxy(function,context)function为执行的函数,content为函数的上下文this值会被设置成这个object对象!DOCTYPEhtmlhtmllangenheadmetacharsetUTF8metanameviewportcontentwidthdevicewidth,initialscale1。0metahttpequivXUACompatiblecontentieedgetitlejqueryproxytitleheadbodybuttonidbtn点我变红buttonbodyhtmlfunctionproxy(fn,context){returnfunction(){returnfn。call(context,arguments);}}ProxyProxy用于修改某些操作的默认行为Proxy可以理解成,在目标对象之前架设一层拦截,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。Proxy这个词的原意是代理,用在这里表示由它来代理某些操作,可以译为代理器ProxydefinePropertyletwang{name:wanglaoshi,age:29,height:165}letwangMamanewProxy(wang,{get(target,key){if(keyage){returnwang。age1;}elseif(keyheight){returnwang。height5;}returntarget〔key〕;},set(target,key,val){if(keyboyfriend){letboyfriendval;if(boyfriend。age40){thrownewError(太老);}elseif(boyfriend。salary20000){thrownewError(太穷);}else{target〔key〕val;returntrue;}}}});console。log(wangMama。age);console。log(wangMama。height);wangMama。boyfriend{age:41,salary:3000}Vue2和Vue3
  Vue2中的变化侦测实现对Object及Array分别进行了不同的处理,Object使用了Object。definePropertyAPI,Array使用了拦截器对Array原型上的能够改变数据的方法进行拦截。虽然也实现了数据的变化侦测,但存在很多局限,比如对象新增属性无法被侦测,以及通过数组下边修改数组内容,也因此在Vue2中经常会使用到set这个方法对数据修改,以保证依赖更新。
  Vue3中使用了es6的ProxyAPI对数据代理,没有像Vue2中对原数据进行修改,只是加了代理包装,因此首先性能上会有所改善。其次解决了Vue2中变化侦测的局限性,可以不使用set新增的对象属性及通过下标修改数组都能被侦测到。对比代理模式VS适配器模式
  适配器提供不同接口,代理模式提供一模一样的接口代理模式VS装饰器模式
  装饰器模式原来的功能不变还可以使用,代理模式改变原来的功能

韩国行游影记(13)首尔迎宾馆(二)在新罗宾馆的左上方,有一个小山坡,当时并不知道是一个公园,走上去一看,才发现这里别有洞天。从山坡上可以俯瞰山下的迎宾馆,还可以看到首尔的市景。这个小山上就是一座小型……甘肃擦亮陇上乡遇品牌推动乡村旅游连片发展扩容升级中国甘肃网12月14日讯(本网记者张兰琴文图)12月14日上午,在甘肃省文旅厅面向全省召开的文化进万家旅游迎新春百日攻坚行动启动大会上,省委宣传部副部长、省文旅厅党组书记何效祖……江苏省普通高中学业水平合格性考试卷(七)一、单选题(共0分)科幻电影《流浪地球》讲述了一个未来故事:太阳急速老化,人类选择距地球4。2光年的比邻星系作为新家园。人类带地球逃离太阳系期间,暂居在距地面5千米的地下……大S汪小菲还在抢床垫,他们又开始秀恩爱最近,霸占热搜榜的s家族和汪氏母子之间的离婚抓马互撕大战,热度堪比世界杯。连六公主都十分应景的放映了法国影片《红白蓝三部曲之蓝》,cue两人的床垫梗。这场旷日持久的……永劫无间崔三娘是单排的版本答案?F1技能的使用,伤害相当爆炸最近永劫无间这款游戏,也是在12月23日,进入了一次较大的更新,其中官方不仅推出了,无尽枪火,暗域狂潮,平安使者等活动,还特意把变身机制给总体调整了一波。算是让天海和岳山变弱了……快报曼联夏天美国淘金,对手竟然是英非联球队太阳报曼联将在今年夏天前往美国进行巡回赛,可能会前往拉斯维加斯并与雷克斯汉姆进行一场友谊赛赛(雷克斯汉姆目前由两位美加演员拥有)。足球总监约翰默托(JohnMurt……游戏党电竞网咖的新一代神U!黑盒i512490F3050推荐i512490F是一款intel为中国玩家们特别推出的12代主流级游戏神U。通常这种情况下的游戏级CPU也是整体装机性价比的关键所在,那么今天咱们就按i512490F配一套性价……蒋凡寻找新大陆12月6日,阿里公布了新一轮组织架构调整变动。调整的重点是,新成立了包括大淘宝(淘宝、天猫、阿里妈妈)、B2C零售事业群(天猫超市、天猫国际、考拉海购)以及原属于阿里电商……地球重达60万亿亿吨,它持续转动45。5亿年,动力来自哪里?是什么力量使地球自转人们曾经天真地认为,地球上的昼夜交替,是因为太阳在围绕着转动,后来人们才逐渐认识到,地球上存在白天和黑夜的原因,其实是因为地球一直在自转,每完成一次自……大型医院手麻系统源码,C。net桌面软件CS版C手术麻醉系统源码,C。net桌面软件CS版,前后端分离,仓储模式开发语言:C开发工具:VisualStudio2019前端框架:Winform后端框架……脖子频繁出现酸痛可能与这些因素有关头部和躯干之间由脖子相连接,别看脖子在人体所占的比例并不大,在它的范围之处同样有着肌肉、甲状腺、气管、食管、颈椎、脊髓和脊髓神经等组织,无论哪一种组织都对人体有着非凡的意义。……茶馆之外蓝天野北京人艺70周年院庆,又见《茶馆》,不见秦二爷。蓝天野去世,戏剧界痛失大家,而对80后90后来说,蓝天野留下更深的印象,可能是1990年首播的电视剧《封神榜》中的姜子牙。……
张柏芝也难逃岁月沧桑!脸部蜡黄穿粉色上衣减龄显嫩张柏芝也难逃岁月沧桑!脸部蜡黄穿粉色上衣减龄显嫩张柏芝也难逃岁月沧桑!脸部蜡黄穿粉色上衣减龄显嫩张柏芝也难逃岁月沧桑!脸部蜡黄穿粉色上衣减龄显嫩张柏芝也难逃岁……从1到40以上,中国电商发展的这10年,究竟经历了什么?中国的技术巨人,如阿里巴巴、腾讯、京东,主导着迅速成长的网络生态。中国的消费者已经熟练掌握了手机技术,即使是老一辈的人也没有因为手机业务和O2O的购物而感到不安。电子商务……大脑为啥要删除3岁前的记忆?你小时候到底看见了啥?转自作者:龙牙你看见了爱。你看见了我的狂喜,看见了初为人父的我那种欣喜若狂、大失其态,乃至于忘乎所以、手舞足蹈。这是个年轻而血气方刚的人,你降生的日子对于他来说注定……孩子这些表现表明他早已在近视的边缘了,你知道吗?如何预防近视现在走到大街上都已经不是四目相对了是八目相对。。。。近视人群的发展越来越庞大毫不夸张的说,路上行人基本一半以上的人都近视近些年来近视也越来越低龄化……亲手折断了属于自己的玫瑰如果没有长青树那就做自己自由的花。要看到人生微弱的灯光,你必须走进最深的黑暗。就在一次次日升月落里,再爱一次人间。可惜世上没有反方向的钟,这交替的四季都在告诫你别回头了。浪漫不……柳鑫宇退役后想当教练,为祖国效力,诗玥想推广冰舞,更多人参与早前,柳鑫宇和王诗玥接受一汽红旗专访,在采访中,主持人询问马达引擎退役后有什么打算?大柳表示,退役后想继续为国家效力,做一名教练,帮助更多的年轻人,让更多运动员接过他们的……15。6英寸超大屏设计,小度添添自由屏晒单前面寒假的时候空闲的时间比较多,想要选择一款设备放在床头追剧。我个人比较喜欢玩各类数码产品,一番搜索之后入手了这款15。6英寸的巨屏平板,使用了一段时间以后,简单晒单晒单吧。……全球研发中国首试在中国全球首发?跨国公司这波神操作背后啥逻辑进博会走到第四届,参展商的首发路数变了。76岁的丹麦循环泵巨头格兰富,集全球工程师之力研发的一套智能泵组,在苏州基地生产后,不敢贸然发布,先拿到山东两个老旧换热站改造工程……咸林智慧运维勇敢说不《勇敢说不》作者:田萧萧行政部妥协也许在成年人的世界是十分常见的事情处理方法。处理一件事或许是碍于面子,或许是避免麻烦,尽管在这个过程中并不开心,但仍会选择避而不谈……英雄退场,16号高挂斯台普斯上空今日湖人对阵灰熊的比赛中场,湖人为加索尔举办了一场盛大的球衣退役仪式。FIBA官方晒出加索尔海报并为其祝贺。斯台普斯现场的座位上铺满了加索尔16号紫金配色球衣,把整个场馆……NASA科学家利用机载观测站SOFIA观测到银河系中心附近的根据一项新研究,观察SagittariusB的电离碳排放提供了关于我们自己的星系和其他星系中的恒星形成的关键信息。Sagittarius(或称SgrB),是靠近银河系中心……确山共建美丽乡村共享美好生活河南日报客户端记者祁道鹏见习记者黄妍妍通讯员段阳东陶琳琳兴产业,激活乡村振兴活力;美环境,绘就宜居乡村美景;育新风,培根铸魂厚植文明。今天的确山县,正在齐心协力绘就一幅美……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网