前端需要了解的 7 种设计模式/附:快速掌握前端必会的7种设计模式课程

前端需要了解的 7 种设计模式/附:快速掌握前端必会的7种设计模式课程

快速掌握前端必会的7种设计模式课程——领取方式点本社头像

1. 什么是设计模式?

既然要讲设计模式那么总得先对设计模式有所了解。

1.1 定义

设计模式是一套通用的可复用的解决方案,用来解决在软件设计过程中产生的通用问题。它不是一个可以直接转换成源代码的设计,只是一套在软件系统设计过程中程序员应该遵循的最佳实践准则。

1.2 设计模式怎么来的?

在 1994 年,由四位大佬(人称'四人帮')合著出版了一本名为 Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素) 的书,该书首次提到了软件开发中设计模式的概念。他们所提出的设计模式主要是以下基于面向对象的设计原则:
  1. 对接口编程而不是对实现编程。
  2. 优先使用对象组合而不是继承。


1.3 设计模式与前端

有些眼尖的小伙伴看到面向对象时就会问了: 既然设计模式是基于面向对象的, 那么对于不能算是面向对象的js来说是不是就没用了呢?
答案很显然不是的。设计模式本质上就是一种编程思想, 它只是最早被人以面向对象的语言来实现罢了。
也就是说, 不管是面向对象还是面向过程,都可以用到设计模式来优化我们的代码。

1.4 设计模式原则

设计模式的原则其实有好多种说法, 这里我们就以 SOLID 原则为例简单了解一下。

2. 前端开发常用的几种设计模式

2.1 发布-订阅模式

定义:发布/订阅是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者)。而是将发布的消息分为不同的类别,然后分别发送给不同的订阅者。

发布订阅模式可能是前端开发者听得最多的设计模式之一了, 很多状态管理工具或者组件间通信都有用到,所以就不过多赘述了。

跟发布订阅模式经常一起被提起的就是观察者模式了, 本质上发布订阅是观察者模式的扩展。二者最大的区别就是发布订阅模式在观察者与被观察者之间加了个中介, 这样就将二者解耦了,被观察者不需要再处理与观察者相关的逻辑。

举个栗子:

小红和小明都想喝牛奶。

观察者模式就是二者都打电话给牛奶站, 由牛奶站给他们配送。

而发布订阅模式则是给代理商打电话,然后牛奶站只要给代理商送牛奶, 由代理商来进行配送。这样如果又要喝果汁了,也只要跟代理商交流, 而不需要再去给果汁店打电话。


发布订阅模式↑

观察者模式↑

常见订阅发布模式使用场景

事件监听, eventBus。

什么时候适合使用发布订阅模式?

当你负责的模块,基本满足以下情况时

需要注意点什么?

当订阅的事件变多时,会增加维护成本。

2.2 策略模式

定义: 该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。

从定义我们可以看出, 策略模式是由一系列相似的算法组成的, 我们可以根据具体情况自由地选择调用哪个算法, 简单地可以理解为if-else的升级版。

举个栗子:

现在有个列表页的需求, 列表有一列操作列, 操作列的操作项需要根据后端返回的数据动态展示。那么, 按照我们常规的思路可能会这么写。

很显然, 这样写肯定能实现需求, 但是如果后面需求变了, 又要增加一个查看按钮, 那么我们肯定就要在这里再加一个else if 上去, 每次加按钮都得加一次, 如果还要夹杂其他判断条件, 那么这个函数一定会变得非常的臃肿且难以维护。

这个时候就可以用到策略模式了:

这样一来, 后面即使需求变了,我们也不需要改动renderOperators 这个函数, 只要在 strategies 上加个配置就可以了, 符合开闭原则。

常见策略模式使用场景

登录页需要多种方式登录, 表单校验, 表单渲染, 列表渲染

什么时候用策略模式?

当你负责的模块,基本满足以下情况时

需要注意什么?

调用者必须理解所有策略算法的区别,以便适时选择恰当的算法类/函数。

2.3 适配器模式

定义: 将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

举个栗子:

我们现在有一个需求, 要在商城加一个优惠券组件, 但是我们经过调研发现原来在 CRM 已经有一个了, 并且样式跟我们要的一样, 唯一的问题是后端返回的数据与现有组件的不一样。这个时候我们肯定希望能复用这个优惠券组件, 那么就可以用到适配器模式了, 只要将商城后端给的数据格式转换成优惠券组件需要的格式就行了。

有机智的的小伙伴可能就会问了, 这不就是把请求的接口数据转换一下吗, 这也算是设计模式吗?

没错, 是的, 设计模式就是这么简单~

当然, 适配器虽好, 可不要贪多哦。

过多地使用适配器,会让系统非常凌乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。

常见适配器模式使用场景

接口数据转换

2.4 代理模式

定义: 代理模式是为其它对象提供一种代理以控制这个对象的访问,具体执行的功能还是这个对象本身。

比如说,我们发邮件,通过代理模式,那么代理者可以控制,决定发还是不发,但具体发的执行功能,是外部对象所决定,而不是代理者决定。

再比如说, 我们在开发过程中经常需要使用 console.log 打印相关数据, 但是通常不希望在线上环境直接打印这些内容, 可是在排查错误时又可能需要用到这些打印。

那么为了实现这种功能, 就可以用到代理模式, 将 console.log 做一层代理, 然后用代理的方法来执行打印的功能:

这样只有当地址栏有我们规定的参数时才进行打印内容, 没有时不打印。

常见代理模式使用场景

图片预加载、数据缓存、拦截器等

什么时候用代理模式?

需要注意什么?

2.5 责任链模式

定义: 职责链模式是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。

举个栗子:

如图所示,我们申请设备之后,接下来要选择收货地址,然后选择审核人,而且必须是上一个成功,才能执行下一个

有的小伙伴一看, 那还不简单, 咔咔就写完了:

嗯, 这么写确实没问题, 然而过了几天, 又来了个新需求, 申请设备后要检查库存, emmmm, 也简单, cv大法搞起直接copy一下改改逻辑呗。

image.png

这个时候就可以用到责任链模式了。

很明显, 这样写, 将各模块之间完全解耦了, 每个模块只需要关注自身的逻辑, 而不需要考虑其他的。这样, 如果有其他需求也要用到某个模块的功能, 就可以直接拿来用, 而不需要修改任何代码

常见责任链模式使用场景

什么时候用责任链模式?

当你负责的模块,基本满足以下情况时

需要注意什么?

2.6 单例模式

定义: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。

单例模式两种写法:

javascript与单例

前面的几种实现方式,他们更多接近的传统面向对象语言的实现,对于JavaScript这种无类语言来说有点穿棉衣洗澡,因为传统面向对象语言单例对象从"类"中创建而来,而我们天生拥有极简的对象创建方式,大可不必模仿强类型语言去实现单例,对没错!我们只需要直接创建对象就是单例模式,只要做好以下两点

js中最简单的单例:

有的小伙伴可能就吃惊了 , 原来在js里声明一个对象就算是用到单例模式了吗, 没错, 就是这么骚。所以对于前端小伙伴来说, 单例模式可以算是我们用得最多的一个设计模式了。

惰性单例--敲黑板

惰性单例才是单例模式的重点! 它所指的是, 在需要的时候才创建实例对象; 这模式在真实开发极其有用!

举个栗子:

我们正在开发一个网站,网站类型是一个视频网站,网站有个登录按钮,点击登录会弹出一个登录框进行登录,你现在可能已经联想到,这个登录框一定是页面唯一的一个dom节点,一个页面存在两个登录框是不存在的!



如果要实现这种效果第一种解决方案就是在页面加载的时候就已经创建好dom节点,并且设置样式为 display 为 none,当点击登录时修改为 block 显示;

但是我如果作为一个用户, 可能在一天的使用中都不会去打开这个登录框。那么这样很显然是浪费了一些性能的, 并且如果有很多类似的其他功能的弹窗也这么做, 那么这里的性能浪费就很明显了。

具体代码可参考上面的示例

常见单例模式使用场景

什么时候用单例模式?

当你负责的模块,基本满足以下情况时

需要注意什么?

3. 总结

学习设计模式后,我们可以发现,设计模式是无处不在的。在学习设计模式之前的很多时候我们是凭借过往经验和智慧来完善系统的设计,而这些经验很多时候正好和某个设计模式的思想不谋而合。

同时设计模式也并不拘泥于某种类型的语言, 它对于任何语言的程序开发来说都是有着实用价值的。了解设计模式可以帮助我们的代码更加健壮, 更易于维护, 能更好地解决很多问题。

但是, 话又说回来, 设计模式本质上就是一种工具, 我们在开发时不需要为了使用某种设计模式而特意去那样写。学习设计模式与设计优秀的软件并不相关,盲目追求和套用书中的设计模式只能使项目变得更加糟糕。

设计模式既不能让我们学到绝世武功,也不能帮我们打通任督二脉,从此看破系统中的所有巧妙设计,认为自己学到了神功,想要在项目中大展身手套用书中的设计时很有可能会带来错误设计,成为项目中的遗留代码并被接手的工程师吐槽和重构。我们要清楚地知道设计模式的局限性以及待解决问题的上下文,才能做出好的设计。

代做工资流水公司大庆办理公司流水大庆查询个人流水肇庆银行流水PS开具南京办理企业贷流水黄冈消费贷流水报价滁州流水单多少钱邯郸签证银行流水 代做潮州房贷流水查询台州入职银行流水多少钱西安签证工资流水查询大庆打印贷款工资流水长沙办对公流水漳州代开流水账单上海代开工作收入证明岳阳银行流水账图片银川入职银行流水代办威海打印工资证明常州房贷收入证明多少钱镇江日常消费流水公司杭州工作收入证明费用信阳代办银行流水芜湖薪资银行流水模板上饶工作收入证明模板厦门查签证工资流水大连打背调流水宜春个人银行流水报价长春银行流水单多少钱成都企业贷流水图片舟山代办对公账户流水厦门个人工资流水 代开香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

代做工资流水公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化