原文链接: https://interview.poetries.top/docs/excellent-docs/16-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F.html

常用设计模式

简版速记

面试速记:把设计模式落到「它解决什么问题 + 一句话实现思路」上,比背定义有用得多。

三大类速查

分类关注点本文涉及模式
创建型怎么创建对象工厂(简单/抽象)、单例
结构型怎么组合对象装饰器、适配器、代理、享元
行为型对象间怎么协作策略、状态、观察者、迭代器、中介者

每个模式一句话

  • 工厂模式:把 new 的过程单独封装;有大量构造函数时考虑它。抽象工厂处理「成族成等级」的复杂产品。
  • 单例模式:全局只有一个实例。核心三件套——getInstance 方法、instance 变量、闭包/静态方法做拦截。Vuex 的 install、Redux Store 都是它。
  • 装饰器模式:「只添加不修改」给对象包一层。ES7 @decorator 语法糖在编译期执行,类装饰器拿到类本身,方法装饰器拿到 (target, name, descriptor)。React HOC、Redux connect 都是它。
  • 适配器模式:抹平接口差异,「把变化留给自己,把统一留给用户」。axios 用它统一了 Node(http) 与浏览器(xhr) 两套实现。
  • 代理模式:不能/不便直接访问目标时加一个中间层。ES6 Proxy 拦截 get/set;常见有事件代理(利用冒泡只绑一次)、虚拟代理(图片懒加载/预加载)、缓存代理(空间换时间)。
  • 策略模式:把一系列算法封装起来可互换,用「对象映射」替代 if-else,满足单一职责 + 开放封闭。
  • 状态模式:对象内部状态改变时改变行为。实现上同样用状态-行为映射对象,注意让处理函数能拿到主体实例(挂为实例属性)。
  • 观察者模式:一对多依赖,目标变化时通知所有观察者。最高频面试点Publisher(add/remove/notify) + Observer(update)。Vue 响应式 = Observer/Dep/Watcher。
  • 发布-订阅模式:观察者的「解耦升级版」,发布者与订阅者通过第三方事件中心通信、互不感知。EventBus/EventEmitter 是它;务必能手写 on/emit/off/once
  • 迭代器模式:统一遍历集合而不暴露内部结构。ES6 用 Symbol.iterator + for...of + next()Generator(function*/yield) 可快速生成迭代器。
  • 中介者模式:对象间通过中介者通信,降低两两耦合(与发布-订阅思想相近,但更聚焦业务协调)。
  • 享元模式:减少对象创建个数,把可变的「外部状态」从对象里抽离,大量相似对象时省内存。

高频追问

  • 观察者 vs 发布-订阅:是否有第三方、发布者能否直接感知订阅者。前者直接触达、仅减少耦合;后者经事件总线、完全解耦。
  • 策略 vs 状态:结构几乎一致(都靠映射对象消灭 if-else),区别在语义——策略是「算法可互换」,状态是「状态切换驱动行为变化」。

目录

Last Updated:
Contributors: leeguooooo