# 常用设计模式

# 单例模式

  • 定义:全局只实例化一个对象
  • 例子:jQuery,购物车

# 适配器模式

  • 场景:旧接口格式和使用者不兼容,中间加一个适配转换接口
  • 定义:将旧接口与使用者进行分离
  • 例子:插头,ajax

# 装饰器模式

  • 场景:为对象添加新功能,不改变其原有的结构和功能
  • 定义:将现有对象和装饰器进行分离,两者独立存在
  • 例子:手机壳,ES7装饰器,core-decorators

# 代理模式

  • 场景:使用者无权访问目标对象,中间加代理,作授权和控制
  • 定义:代理类和目标类分离,隔离开目标类和使用者
  • 例子:科学上网,明星经纪人

# 外观模式

  • 定义:为子系统中的一组接口提供了一个高层接口,使用者使用这个高层接口。
  • 例子:jQuery 大量使用,很多函数都可以传递多种参数。

# 观察者模式(最常用)

  • 定义:通过发布&订阅,主题和观察者分离,不是主动触发而是被动监听,两者解耦
  • 例子:网页事件绑定, Promise,EventEmitter, fs.readStream,http请求,多进程通讯,vue, react 生命周期, vue.watch

# 迭代器模式

  • 场景:顺序访问一个集合,使用者无需知道促使的内部结构
  • 定义:迭代器对象和目标对象分离,使用者与目标对象隔离
  • 例子:jQuery.each, ES6 Interator, ES6 Generator

# 状态模式

  • 定义:将状态对象和主题对象分离,状态的变化逻辑单独处理(可以放在状态对象中)
  • 例子:红绿灯,收藏/取消,Promise, javascript-state-machine

# 原型模式

  • 定义:clone自己,生成一个新对象,使开销减少
  • 例子:Object.create(prototype)

# 桥接模式

  • 定义:把抽象化与实现化解耦,使二者可独立变化
  • 例子:画图,把颜色和形状分开创建和组合

# 组合模式

  • 定义:生成树形结构,表示“整体-部分”,且有一致的操作方式
  • 例子:目录文件树, vnode, 导航菜单

# 享元模式(服务器中更多)

  • 定义:共享内存(主要考虑内存,而非效率),相同数据,共享使用
  • 例子:网页事件代理

# 策略模式

  • 定义:不同策略分开处理,避免大量 if...else / switch...case
  • 例子:不同的排序算法,各地的社保规则

# 模板方法模式

  • 定义:一个操作包括多个子操作
  • 例子:各大MVC框架

# 职责链模式

  • 定义:一步操作分多个职责角色来完成,把角色分开,用一个链串起来,将发起者和各个处理者进行隔离
  • 例子:审批流程,JS链式操作,Promise.then

# 命令模式

  • 定义:执行命令时,发布者和执行者分开,中间加入命令对象,作为中转站
  • 例子:网页富文本编辑器,浏览器封装了命令对象, document.execCommand('bold/undo')

# 备忘录模式

  • 定义:随时记录一个对象的状态变化,随时可以恢复之前的某个状态
  • 例子:编辑器
更新时间: 4/28/2020, 6:24:19 PM