这是我参与「第四届青训营 」笔记创作活动的的第3天
在目前,谈到设计模式,主要就是谈到1994年出版的设计模式这本书。
设计模式分类
在设计模式这本书里,一共谈到了23种设计模式,它们被分为
- 创建型 -- 如何更高性能的创建对象
- 结构型 -- 如何将各个对象组装成一个完整结构
- 行为型 -- 负责对象间的通行和职责划分,谁先进行操作,谁后进行操作
以上的内容都是基于java的面向对象型设计模式,那么接下来着重强调一下前端领域的设计模式应用
⭐浏览器中的设计模式
1.单例模式
单例模式就是一个类中只能存在一个能全局访问的对象,你无法通过构造器生成额外的对象,只能通过该类的全局方法去获取这个单例对象。单例模式有懒汉式和饿汉式两种写法,针对不同的场景使用
那么针对与前端,在前端中单例模式的应用有js中的gloabl对象,在浏览器中显示为window对象,它就是一个典型的单例对象。除次之外还有Math,它们都是单例内置对象
应用场景
实现数据缓存和全局状态管理
2.发布订阅模式
是一种订阅机制,指的是在被订阅对象发生改变时,通知订阅用户。也是一种观察者模式的感觉
应用场景
用于从系统架构之间的解耦,从业务中一些实现模式,像邮件订阅,上线订阅等等,应用很广泛。
像常见的事件监听也是一种消息发布订阅模式,在事件发生后,通知监听者。 在上节课中,老师使用到自定义事件slide去解耦组件,就可以看成这种方法。
还有大家常见的前端框架中,对于数据改变模板重新进行编译,也使用到消息发布订阅模式去通知使用到数据的地方进行更新。
⭐javascript中的设计模式
原型模式
复制已有对象来创建新的对象
应用场景
JS中对象创建的基本模式 体现为原型链,我们在使用Object.create()这个函数式,就可以传入一个对象,把它作为新生成对象的原型。存在于对象原型中的方法,也就可以被多个对象同时使用,避免造成空间浪费这一问题。
代理模式
可以自定义控制对原对象的访问方式,并且允许在更新前后做一些额外处理。就比如说在java中,当我们无法继承Thread类时,可以通过Runnable接口去间接帮忙调用Thread类,这就是一种代理模式的体现,通过不同访问方式,去控制相同的东西。
应用场景
监控、代理工具和前端框架实现
在这里我们使用到js中的一个函数构造函数Proxy,它会创建一个代理对象,传入的参数第一个为被代理的原对象,第二个配置对象中有get和set方法
迭代器模式
在不暴露数据类型的情况下访问集合中的数据
在JS中我们可以写[Symbol.iterator]函数来实现一个对象的可迭代能力
应用场景
数据结构中有多种数据类型,列表,树等,提供通用操作接口
⭐前端框架中的设计模式
1.代理模式
在前端框架中,我们会遇到虚拟DOM这个概念,它就是代理模式在框架中的一个体现。当我们每次操作DOM时,实际上是在操作对应的虚拟DOM,虚拟DOM再根据diff算法与DOM进行比较,再来通过何时的方式更新DOM结点。
2.组合模式
总结
不要太沉迷它,真的说的话,不如使用单元测试来排查和弥补自己的项目不足点