这是我参与【第四届青训营】笔记创作活动的第4天,今天学习了 前端设计模式 的一些知识点
1.什么是设计模式
1.1 概念层面
设计模式(英语 design pattern)是对面向对象设计中反复出现的问题的解决方案。这个术语是在1990年代由Erich Gamma等人从建筑设计领域引入到计算机科学中来的。这个术语的含义还存有争议。算法不是设计模式,因为算法致力于解决问题而非设计问题。设计模式通常描述了一组相互紧密作用的类与对象。设计模式提供一种讨论软件设计的公共语言,使得熟练设计者的设计经验可以被初学者和其他设计者掌握。设计模式还为软件重构提供了目标。 随着软件开发社群对设计模式的兴趣日益增长,已经出版了一些相关的专著,定期召开相应的研讨会,而且Ward Cunningham为此发明了WikiWiki用来交流设计模式的经验。
总之,设计模式就是为了解决某类重复出现的问题而出现的一套成功或有效的解决方案
1.2 软件设计中常见问题的解决方案模型
- 历史经验的总结
- 与特定语言无关
2. 设计模式分类
2.1 23 种设计模式
- 创建型
- 如何创建一个对象
- 结构型
- 如何灵活的将对象组装成较大的结构
- 行为型
- 负责对象间的高效通信和职责划分
2.2 浏览器中的设计模式
- 单例模式
- 发布订阅模式
注意:这两个特别常用
3. 单例模式
3.1 定义
全局唯一访问对象
3.2 应用场景
缓存,全局状态管理等
3.3 用单例模式来实现请求缓存
这里我们使用 TDD 开发的思想去处理这个问题
首先,我们编写一个 jest 测试文件
然后我们再针对于这个测试去解决这个问题
4. 发布订阅模式
4.1 定义
一种订阅机制,可在被订阅对象发生变化时通知订阅者
4.2 应用场景
从系统架构之间的解耦,到业务中一些实现模式,像邮件订阅,上线订阅等等,应用广泛。
const button = document.getElementById('button')
const doSomething1 = () => {
console.log('Send message to user')
}
const doSomething2 = () => {
console.log('Log ...')
}
button.addEventListener('click', doSomething1)
button.addEventListener('click', doSomething2)
4.3 用发布订阅模式实现用户上线订阅
同样的,我们首先编写一个 jest 测试文件
然后,在这个测试文件的基础上,我们对这个测试用例进行编写,并使其通过测试
5. JavaScript 中的设计模式
- 原型模式
- 代理模式
- 迭代器模式
5.1 原型模式
5.1.1 定义
复制已有对象来创建新的对象
5.1.2 应用场景
JS 中对象创建的基本模式
5.1.3 用原型模式创建上线订阅中的用户
jest 测试文件
实现测试
5.2 代理模式
5.2.1 定义
可自定义控制对原对象的访问方式,并且允许在更新前后做一些额外处理
5.2.2 应用场景
监控、代理工具、前端框架实现等等
5.2.3 用代理模式实现用户状态订阅
5.3 迭代器模式
5.3.1 定义
在不暴露数据类型的情况下访问集合中的数据
5.3.2 应用场景
数据结构中有多种数据类型,列表,树等,提供通用操作接口
5.3.3 用 for of 迭代所有组件
6. 前端框架中的设计模式
- 代理模式
- 组合模式
6.1 Vue 组件实现计数器
6.2 前端框架中对 DOM 操作的代理
6.3 DOM 更新后的钩子
6.4 组合模式
6.4.1 定义
可多个对象组合使用,也可单个对象独立使用
6.4.2 应用场景
DOM,前端组件,文件目录,部门