这是我参与「第四届青训营 」笔记创作活动的第3天
推荐书籍:
《设计模式:可复用面向对象软件的基础》:23种设计模式 (创建型、 结构型、 行为型)
浏览器中的设计模式
一、单例模式
- 全局唯一访问对象
- 应用场景: 缓存、全局状态管理等
用单例模式实现请求缓存
发布订阅者模式
- 订阅机制,可在被订阅对象发生变化时通知订阅者
- 应用场景:邮件订阅、上线订阅等
代码分析:button是被订阅对象,函数doSomthing1/doSomething2是订阅者, 这里函数虽然不是对象但也能被当成订阅者。
- 用户上线订阅案例:
上面的代码,第一段是订阅者通知函数的类型定义,第二段user内的followers是订阅者内部有用户和订阅函数,构造函数内部是一些默认值;第三段subscribe为订阅函数,存入订阅者的一些信息;第四段是online即在线状态,需要将默认状态变为online,同时给订阅者通知
- 这里user3是被user1和user2的对象,user3上线后开始通知user1、user2同时也可以相互订阅
JavaScript中的设计模式
原型设计模式
- 复制已有对象来创建新的对象
- 应用场景:JS对象创建
上面的代码,与第一个不同之处就是首先创建user的原型类,之后根据已有原型对象创建一个新的user对象,继承原型的属性,同时可自定义自己的属性、方法
代理模式
-
可自定义控制对原对象的访问方式,并且允许在更新前后做一些额外处理
-
应用场景:监控、代理工具、前端框架(vue)
-
前提:一个对象或一个函数只做一件事
迭代器模式
- 在不暴露数据类型的情况下访问集合中的数据
- 应用场景:数据结构中有多种数据类型,列表,树等,提供通用操作接口
map是键值对、set是集合
- 上面的代码:首先分别创建body、header、main、banner、content、footer标签,接着依次将除body外标签放入body内形成dom树上的元素,创建一个标签数组,使用for循环遍历body内元素,将他们依次放入数组内,接着判断长度是否为5