首页 > 编程语言 >Javascript:设计模式-代理模式

Javascript:设计模式-代理模式

时间:2022-08-25 10:00:25浏览次数:68  
标签: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,设计模式
From: https://www.cnblogs.com/fqs123456/p/16623245.html

相关文章

  • 设计模式之组合模式
    本文通过老王和小王探讨书房、书架、各类书的管理问题,引出结构型设计模式家族中的一个重要成员——组合模式,本文会给予两种组合模式的典型代码实现,为了加深理解会在第三部......
  • 「中高级前端面试」JavaScript手写代码无敌秘籍
    手写路径导航实现一个new操作符实现一个JSON.stringify实现一个JSON.parse实现一个call或apply实现一个Function.bind实现一个继承实现一个JS函数柯里化手写一个......
  • 盒子模型、 浮动布局、定位属性、 z-index、JavaScript基础语法
    今日内容概要盒子模型浮动布局定位属性z-indexJavaScript基础语法今日内容详细盒子模型所有的标签都可以看成是一个快递盒1.外边距(margin):指标签之间的距离(......
  • 设计模式 23 访问者模式
    参考源https://www.bilibili.com/video/BV1u3411P7Na?p=31&vd_source=299f4bc123b19e7d6f66fefd8f124a03访问者模式(VisitorPattern)属于行为型模式概述生活中经常......
  • JavaScript知识-简介、语言规范、语言基础
    目录JavaScript简介1.ECMAScript和JavaScript的关系2.JavaScript语言3.HTML、CSS、JavaScriptJavaScript基础之语言规范1.如何使用?2.注释3.结束符JavaScript语言基础1.Java......
  • 设计模式 22 策略模式
    参考源https://www.bilibili.com/video/BV1u3411P7Na?p=30&vd_source=299f4bc123b19e7d6f66fefd8f124a03策略模式(StrategyPattern)属于行为型模式概述生活中会面......
  • 04.Javascript学习笔记3
    1.箭头函数箭头函数是一种更短的函数表达式。constage=birthyear=>2022-birthyear;console.log(age(2000))箭头左边的birthyear是参数,箭头右边是要执行的代码......
  • Iterator设计模式
    迭代器设计模式用集合类实现Aggregate接口,并实现其iterator方法,生成特定的迭代器对象,但返回时返回为Iterator类型,以此来抽象编程,实现解耦合的目的。类图:   当使用......
  • 设计模式10 - 设计模式 - 适配器设计模式(高频-结构型)
    一、定义适配器模式将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能在一起工作的那些类可以一起工作。    适配器模式......
  • 常用设计模式(Python版)
    1.设计模式是什么?有什么用?设计模式是软件开发过程中经过验证的、用于解决特定环境下、重复出现的、特定问题的解决方案。根据GoF(GangOfFour),设计模式被分为三类:创......