js常用设计模式对比以及使用场景

488 阅读2分钟

设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。

面向对象

* 封装、继承、多态
* 数据结构化

封装三要素

* public完全开放
* protected对子类开放
* private对自己开放

5大设计原则

* 单一职责
* 开放封闭
* 李氏置换
* 接口独立
* 依赖倒置

设计模式类型

* 创建型
* 结构型
* 行为型

常用设计模式对比

模式类型特点应用场景
工厂模式将new操作单独封装jQuery - $('div) React.createElement vue 异步组件
单例模式系统中被唯一使用, 一个类只有一个实例登录框 购物车
适配器模式旧接口格式和使用者不兼容,中间加一个适配转换接口封装旧接口 vue computed
装饰器模式为对象添加新功能,不改变原有的结构和功能ES7装饰器 (babel-plugin-transform-decorators-legacy) core-decorators
代理模式使用者无权访问目标对象,中间加代理,通过代理做授权和控制网页事件代理 $.proxy ES6 Proxy
外观模式为子系统中的一组接口提供一个高层接口,使用者使用这个高层接口
观察者模式发布 & 订阅, 一对多网页事件绑定 Promise jQuery Callbacks nodejs 自定义事件、处理http请求、多进程通讯 vue和React组件生命周期触发 vue watch
迭代器顺序访问一个集合,使用者无须知道集合内部构造jQuery each ES6 Iterator [Symbol.iterator]属性(函数,执行返回迭代器)
状态模式个对象有状态变化,每次变化会触发一个逻辑有限状态机 收藏、取消(javascript-state-machine) promise实现

其他设计模式

* 原型模式
    * clone自己,生成一个新对象
    * Object.create()

* 桥接模式
    * 抽象和实现分离

* 组合模式
    * 生成树形结构,将整体和单个节点的操作抽象出来
    * 虚拟DOM中的vnode

* 享元模式
    * 共享内存
    * 相同的数据,共享使用

* 策略模式
    * 不同策略分开处理
    * 避免 if...else...

* 模板模式

* 职责链模式
    * 一步操作可以分为多个职责角色来完成
    * 角色都分开,然后用一个链串起来
    * 将发起者和各个处理者隔离

* 命令模式
    * 发送者 -》 命令对象 -》 接收者
    
    * 网页富文本编辑器操作,浏览器封装了一个命令对象(document.execCommand('bold'))

* 备忘录模式
    * 随时记录一个对象的状态变化
    * 随时可以回复之前的某个状态(如撤销功能)
    
    * 备忘录,备忘列表,编辑器

* 中介者模式

* 访问者模式
    * 将数据操作和数据结构进行分离