ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Javascript:设计模式-代理模式

2022-08-25 10:00:34  阅读:296  来源: 互联网

标签:function flower receiveFlower Javascript 代理 Flower var 设计模式


例:该例为书中原例,小明(xiaoming)遇到了女神(A),打算送个花来告白,刚好小明打听到女神有个朋友叫(B),自己不太好意思,所以决定让B来送花,虽然这件事儿肯定是凉了,但是作为例子还是很有教育意义

 

代码实现:不用代理模式,头铁直接送

var Flower = function() {}   // 小明做的事   var xiaoming = {     // 方法函数:发送花     sendFlower: function(target) {       // 买花       var flower = new Flower()       target.receiveFlower(flower)     }   }       // 小A做的事   var A = {     // 方法函数:收到花     receiveFlower: function(flower) {       console.log('收到花 ' + flower)     }   }       // 小明送花给A   xiaoming.sendFlower(A)

 

代码实现:引入代理找朋友送

var Flower = function() {}   var xiaoming = {     sendFlower: function(target) {       var flower = new Flower()       target.receiveFlower(flower)     }   }   var B = {     receiveFlower: function(flower) {       A.receiveFlower(flower)     }   }   var A = {     receiveFlower: function(flower) {       console.log('收到花 ' + flower)     }   }   xiaoming.sendFlower(B)

 

执行结果是一样的,那么这么做的意义是什么呢,看起来只是把简单的事情变得复杂了,像脱裤子放屁多此一举,自己送花跟找别人送有什么区别?

 

那我们现在来改变背景设定,假设当 A 在心情好的时候收到花,小明表白成功的几率有 60%,而当 A 在心情差的时候收到花,小明表白的成功率无限趋近于 0。

小明跟 A 刚刚认识两天,还无法辨别 A 什么时候心情好。如果不合时宜地把花送给 A,花 被直接扔掉的可能性很大,这束花可是小明吃了 7 天泡面换来的。

但是 A 的朋友 B 却很了解 A,所以小明只管把花交给 B,B 会监听 A 的心情变化,然后选 择 A 心情好的时候把花转交给 A,

 

代码实现:

var Flower = function() {}   var xiaoming = {     sendFlower: function(target) {       var flower = new Flower()       target.receiveFlower(flower)     }   }   var B = {     receiveFlower: function(flower) {       A.listenGoodMood(function() {         // 监听 A 的好心情         A.receiveFlower(flower)       })     }   }   var A = {     receiveFlower: function(flower) {       console.log('收到花 ' + flower)     },     listenGoodMood: function(fn) {       setTimeout(function() {         // 假设 10 秒之后 A 的心情变好         fn()       }, 10000)     }   }   xiaoming.sendFlower(B)


像这种操作有个高端的词,叫保护代理,让B过滤掉一些渣男,另外,假设现实中的花价格不菲,导致在程序世界里,new Flower 也是一个代价昂贵的操作

那么我们可以把 new Flower 的操作交给代理 B 去执行,代理 B 会选择在 A 心情好时再执行 new Flower,

这是代理模式的另一种形式,叫作虚拟代理。虚拟代理把一些开销很大的对象,延迟到 真正需要它的时候才去创建。

代码如下:

 

var B = {     receiveFlower: function(flower) {       A.listenGoodMood(function() {         // 监听 A 的好心情         var flower = new Flower() // 延迟创建 flower 对象         A.receiveFlower(flower)       })     }   }

 

作为类的职责来讲,一个类应该只有一种引起它变化的原因,如果一个对象承担多个职责,那么它将变得越来越大难以维护,当多种职责耦合在一起时,反而丧失了当时设计和创建它时的初衷

 

代理模式的例子部分书中引用:

1.比如井下项目中,接收和驳回请求一条数据时,不是点击一条接收一条,而是通过方法媒介收集你选中的ID,通过方法去确认所有接收的数据;

2.缓存模式,在第一次接收到数据的时候,并没有破坏原本的对象,而是缓存了起来,比如,选择项目名称,分页也同理可以达到目的;

3.防火墙代理:保护网络资源访问及核心权限不被靠近;

4.保护代理:针对不同的对象有不同的访问权限,比如咱们侧边栏的权限系统;

 

代理模式我看后的理解更偏向于,基于已有对象设计模式的优化,及中间层媒介,让我们先动起手优化熟悉好项目中的各个公共组件,解耦后,再来动手编写代理也不迟

介绍设计模式的核心理念重要的是理解他的思考和抽离方式,但是设计模式却并不像公式,没法死记硬背,我也比较倾向尽可能的把一个设计模式的思想分享给大家

毕竟代码的逻辑实现可以是多种多样的,千万别被一种写法限制住了思维

 

标签:function,flower,receiveFlower,Javascript,代理,Flower,var,设计模式
来源: https://www.cnblogs.com/fqs123456/p/16623245.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有