常用设计模式
单例模式
- 定义:全局只实例化一个对象
- 例子: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')
备忘录模式
- 定义:随时记录一个对象的状态变化,随时可以恢复之前的某个状态
- 例子:编辑器