前端设计模式应用 | 青训营笔记

137 阅读5分钟

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

下面笔记中各个模式的优缺点包含我自己的一些理解,如有错误感谢指出!

1. 二十三种设计模式

这些模式可以分为三种类型:

  • 创建型:如何创建一个对象
  • 结构型:如何灵活的将对象组成较大的结构
  • 行为型:负责对象间的高效通信和职责划分

2. 浏览器中的设计模式

2.1 单例模式

定义:属于创建型模式,创建唯一访问对象,比如Window全局对象就属于单例模式

应用场景:缓存,全局状态管理(需要控制实例数目,节省系统资源的时候)

代码如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建

优点:

  • 在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例
  • 避免对资源的多重占用(比如写文件操作)。

缺点:

  • 没有接口,不能继承,与单一职责原则冲突;一个类应该只关心内部逻辑,而不关心外面怎么样来实例化

2.2 发布订阅模式

定义:(行为型)此模式分为发布者和订阅者两个概念,发布者收集订阅者的需求,然后在某个时刻告知订阅者。

应用场景: 从系统结构之间的结构,到业务中一些实现模式,像邮件订阅、上线订阅等等

3. js中的设计模式

3.1 原型模式

定义:(创建型)用于创建重复的对象,同时又能保证性能;这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。

应用场景: 当直接创建对象的代价比较大时,则采用这种模式。

优点:

  • 性能提高
  • 逃避构造函数的约束

缺点:

  • 构造函数指向需要手工写入
  • 对于引用类型来说有共享问题的错误

注意: 以这种方式重设constructor属性会导致它的[[Enumerable]]特性被设置为true。默认情况下,原生的constructor属性是不可枚举的,如果不想这个属性可以枚举,可以使用defineProperty方法进行设置

3.2 代理模式

定义:(结构型)可自定义控制对象的访问方式,并且允许在更新前后做一些额外处理

应用场景:监控,代理工具(如:Windows 里面的快捷方式、火车票不一定在火车站买,也可以去代售点等实例),前端框架实现处理

打个比喻:猪八戒去找高翠兰结果是孙悟空变的,可以这样理解:把高翠兰的外貌抽象出来,高翠兰本人和孙悟空都实现了这个接口,猪八戒访问高翠兰的时候看不出来这个是孙悟空,所以说孙悟空是高翠兰代理类

优点:

  • 职责清晰、高扩展性、智能化

缺点:

  • 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
  • 实现代理模式需要额外的工作,有些代理模式的实现非常复杂

3.3 迭代器模式

定义:(行为型)提供一种方法,顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。

应用场景:数据结构中有多种数据类型,列表,树等,提供通用操作接口。

优点:

  • 迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器之后,即使不关心对象的内部构造,也可以按顺序访问其中的每一个元素

4. 前端框架中的设计模式

4.1 代理模式

代理是为了控制对对象的访问,不让外部直接访问到对象。

前端框架中对DOM操作的代理:

  • 更改DOM属性 -> 试图更新
  • 更改DOM属性 -> 更改虚拟DOM -(Diff)> 视图更新

4.2 组合模式

定义:(结构型)可多个对象组合使用,也可单个对象独立使用

应用场景:DOM,前端组件,文件目录,部门

优点: 组合模式可以方便的构造一棵树来表示对象的部分-整体结果,只需要通过请求树的最顶层对象,便能对整棵树做同一的操作;在组合模式中增加和删除树的节点非常方便,并且符合开放-封闭原则

缺点:

  • 组合模式并不是完美的,它可能会产生一个这样的系统:系统中每个对象看起来都与其他对象差不多。它们的区别只有在运行的时候才会显现出来,这会使代码难以理解。
  • 如果通过组合模式创建了太多的对象,那么这些对象可能会让系统担负不起。

结论

浏览器、js、前端框架中的模式应用,代码实现不大相同,但是核心原理是差不多的,理解各个模式,光靠背概念是不够的,更多的还在于自己模式的理解加运用!