参考:JavaScript 中常见设计模式整理
详解 Javascript十大常用设计模式
1、常用的设计模式
- 单例模式
- 一个类只能构造出一个实例。即如果有实例化,只能实例化一次
- 实现:使用一个变量来标识该类是否被实例化
- 例如我们实现弹窗,点击的时候创建一个div元素,如果频繁点击就会不断的创建和删除,此时使用单例模式则只会实例化一次
- 策略模式
- 定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换
- 根据不同的参数可以命中不同的策略,例如动画库里的算法函数
- 代理模式
- 代理对象和本体对象具有一致的接口,例如图片预加载
- 代理是一个对象,它可以用来控制对本体对象的访问,它与本体对象实现了同样的接口,代理对象会把所有的调用方法传递给本体对象的
- 本地对象注重的去执行页面上的代码,代理则控制本地对象何时被实例化,何时被使用
- 优点:代理对象可以代替本体被实例化,并使其可以被远程访问;可以把本体实例化推迟到真正需要的时候;对于实例化比较费时的本体对象,或者因为尺寸比较大以至于不用时不适于保存在内存中的本体,我们可以推迟实例化该对象
- 工厂模式
- 主要为了解决实例化对象产生重复的问题。
- 优点:可以解决多个相似的问题;缺点:不能知道对象识别的问题,即不知道是哪个对象的实例
- 可以在父类中实现一些相同的方法,在子类中重写该父类的方法实现自己的业务逻辑
- 发布-订阅者模式
- 命令模式
- 命令指的是一个执行某些特定事情的指令
- 使用场景:有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道请求的操作是什么,可以使用命令模式来消除发送者与接收者的代码耦合关系。
- 模块模式
- 模块模式是为单例模式添加私有变量和私有方法,能够减少全局变量的使用
- 模块模式使用了一个返回对象的匿名函数。在这个匿名函数内部,先定义了私有变量和函数,供内部函数使用,然后将一个对象字面量作为函数的值返回,返回的对象字面量中只包含可以公开的属性和方法
- 职责链模式
- 通过请求第一个条件,会持续执行后续的条件,直到返回结果为止
- 发送者知道链中的第一个接收者,它向这个接收者发送该请求;每一个接收者都对请求进行分析,然后要么处理它,要么它往下传递;每一个接收者知道其他的对象只有一个,即它在链中的下家(successor);如果没有任何接收者处理请求,那么请求会从链中离开。
- 优点:消除请求的发送者与接收者之间的耦合。
- 模板方法模式:
- 中介者模式
- 对象和对象之间借助第三方中介者进行通信
- 中介者模式的作用是解除对象与对象之间的耦合关系,增加一个中介对象后,所有的相关对象都通过中介者对象来通信,而不是相互引用,所以当一个对象发送改变时,只需要通知中介者对象即可。
- 装饰者模式
- 动态的给函数赋能
- 适配者模式
- 一种数据结构改成另一种数据结构
- 观察者模式
- 当观察对象发生变化时自动调用相关函数
2、设计模式的六大原则
参考:23种设计模式全解析
总原则:开闭原则,即对扩展开放,对修改关闭
在程序需要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码,实现一个热插拔的效果
- 单一职责原则:每个类应该实现单一的职责,如若不然,就应该把类拆分
- 里氏替换原则:子类对父类的方法尽量不要重写和重载
- 依赖倒转原则:写代码时用到具体类时,不与具体类交互,而与具体类的上层接口交互。
- 接口隔离原则:
- 迪米特法则:只与直接的朋友通信
- 合成复用原则:尽量首先使用合成/聚合的方式,而不是使用继承