2020 JS 设计模式学习总结(更新中)

310 阅读4分钟

什么是设计

  • 按照某一种思路或者标准来实现功能
  • 功能相同,可以用不同设计方案来实现
  • 伴随着需求增加,设计的作用才能体现出来

推荐书籍

《UNIX/LINUX设计哲学》

  • 准则01:小即是美
  • 准则02:让每个程序只做好一件事
  • 准则03:快速建立原型
  • 准则04:舍弃高效率而取可移植性(复用性/通用性)
  • 准则05:采用纯文本来存储数据
  • 准则06:充分利用软件的杠杆效应
  • 准则07:使用 shell 脚本来提高杠杆效应和可移植性
  • 准则08:避免强制性的用户界面
  • 准则09:让每个程序都称为过滤器
  • 准则10:各部分之和大于整体
  • 准则11:需求90%的解决方案

SOLID 五大设计原则

  • S(single) - 单一职责原则
  • O(open) - 开放封闭原则
  • L - 李氏置换原则
  • I - 接口独立原则
  • D - 依赖导致原则

S -单一职责原则

  • 一个程序只做好值做好一件事
  • 如果功能过于复杂就拆分KIA,每个部分保持独立

O - 开放封闭原则

  • 对拓展开放,对修改封闭
  • 增加需求时,扩展新代码,而非修改已有代码
  • 软件设计的终极目标

L - 李氏置换原则

  • 子类能覆盖父类
  • 父类能出现的地方子类就能出现
  • JS中使用较少(弱类型 & 继承使用较少)

I - 接口独立原则

  • 保持接口的单一独立,避免出现“胖接口”
  • JS中没有接口(typescript)例外,使用较少
  • 类似于单一职责原则,这里更关注接口

D - 依赖导致原则

  • 面向接口编程,依赖于抽象而不依赖于具体
  • 使用方只关注接口而不关注具体类的实现
  • JS中使用较少

从设计到模式

创建型

  • 工厂模式(工厂方法模式,抽象工厂模式,建造者模式)
  • 单例模式
  • 原型模式

组合型

  • 适配器模式
  • 装饰器模式
  • 代理模式
  • 外观模式
  • 桥接模式
  • 组合模式
  • 享元模式

行为型

  • 策略模式
  • 模板方法模式
  • 观察者模式(重要)
  • 迭代器模式(重要)
  • 职责链模式
  • 命令模式
  • 备忘录模式
  • 状态模式
  • 访问者模式
  • 中介者模式
  • 解释器模式

工厂模式

将 new 操作单独封装,遇到 new 时,就要考虑是否该用工厂模式。
通过函数返回一个已经 new 生成的实例,不在外部创建实例。

为什么需要在内部创建实例

如果直接抛出未实例的对象,那么在创建实例时的一些验证及操作都需要使用者去执行;

设计原则验证

  • 构造函数和创建者分离
  • 符合开放封闭原则

模式案例

  • jQuery - $('div')
  • React.createElement
  • Vue异步组件

单例模式

系统中被唯一使用,一个类只有一个实例

模式案例

  • jQuery 只有一个 $
  • Vuex 和 Redux 中的 store
  • 登录框
  • 购物车

设计原则验证

  • 符合单一职责原则,只实例化唯一的对象
  • 没法具体开放封闭原则,但是绝对不违反开放封闭原则

适配器模式

旧接口格式和使用者不兼容,中间加一个适配转换接口

装饰器模式

为对象添加新功能,不改变其原有的结构和功能

代理模式

使用者无权访问目标对象,中间加代理,通过代理做授权和控制

使用场景

  • ES6 Proxy

代理模式 VS 适配器模式

  • 【适配器模式】:提供一个不同的接口(如不同版本的接口)
  • 【代理模式】:提供一模一样的接口,无权使用,但是又需要使用,所以加代理

代理模式 VS 装饰器模式

  • 【装饰器模式】:拓展功能,原有功能不变且可直接使用
  • 【代理模式】:显示原有功能,但是经过限制或者阉割之后的

外观模式

为子系统中的一组接口提供了一个高层接口,使用者使用这个高层接口

观察者模式

发布&订阅,一对多