设计模式学习 | 青训营笔记

94 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第3天

推荐书籍:

《设计模式:可复用面向对象软件的基础》:23种设计模式 (创建型、 结构型、 行为型)

浏览器中的设计模式

一、单例模式

  • 全局唯一访问对象
  • 应用场景: 缓存、全局状态管理等

用单例模式实现请求缓存

image.png

image.png

发布订阅者模式

  • 订阅机制,可在被订阅对象发生变化时通知订阅者
  • 应用场景:邮件订阅、上线订阅等

image.png

代码分析:button是被订阅对象,函数doSomthing1/doSomething2是订阅者, 这里函数虽然不是对象但也能被当成订阅者。

  • 用户上线订阅案例:

image.png

上面的代码,第一段是订阅者通知函数的类型定义,第二段user内的followers是订阅者内部有用户和订阅函数,构造函数内部是一些默认值;第三段subscribe为订阅函数,存入订阅者的一些信息;第四段是online即在线状态,需要将默认状态变为online,同时给订阅者通知

image.png

  • 这里user3是被user1和user2的对象,user3上线后开始通知user1、user2同时也可以相互订阅

JavaScript中的设计模式

原型设计模式

  • 复制已有对象来创建新的对象
  • 应用场景:JS对象创建

image.png

上面的代码,与第一个不同之处就是首先创建user的原型类,之后根据已有原型对象创建一个新的user对象,继承原型的属性,同时可自定义自己的属性、方法

代理模式

  • 可自定义控制对原对象的访问方式,并且允许在更新前后做一些额外处理

  • 应用场景:监控、代理工具、前端框架(vue)

  • 前提:一个对象或一个函数只做一件事

image.png

迭代器模式

  • 在不暴露数据类型的情况下访问集合中的数据
  • 应用场景:数据结构中有多种数据类型,列表,树等,提供通用操作接口

image.png

map是键值对、set是集合

image.png

  • 上面的代码:首先分别创建body、header、main、banner、content、footer标签,接着依次将除body外标签放入body内形成dom树上的元素,创建一个标签数组,使用for循环遍历body内元素,将他们依次放入数组内,接着判断长度是否为5

前端框架中的设计模式

代理模式

组合模式

参考资料