JavaScript中的设计模式整理如下:
1. 单例模式核心思想:保证一个类只有一个实例。
实现方式:
- 先判断实例是否存在,如果存在直接返回,否则创建再返回。
作用:
- 模块间通信;
- 保证其他类对象的唯一性;
- 防止变量污染。
注意事项:
- 正确使用this;
- 闭包容易造成内存泄漏,及时清理垃圾;
- 创建一个新对象成本较高。
实际应用:
- 任务管理器;
- 回收站;
- 网站计数器;
- 多线程的线程池等。
2. 发布订阅者模式与观察者模式核心思想:定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。
作用:
- 广泛应用于异步编程,替代传递回调函数的方案;
- 可以取代对象之间硬编码的通知机制,一个对象不用再显式地调用另外一个对象的某个接口(松耦合)。
实现:
- 首先指定好谁充当发布者;
- 传给发布者一个缓存列表,用于存放回调函数以便通知订阅者;
- 发布者遍历缓存列表,触发里面的订阅者回调函数。
区别:
- 观察者模式:直接订阅主题,没有中间件;
- 发布订阅模式:会有调度中心统一调度。
3. 工厂模式核心思想:定义一个创建对象的接口,但让子类决定实例化哪一个类。工厂方法让一个类的实例化延迟到子类。
作用:
- 创建对象的过程可能很复杂,但我们只需要关心结果;
- 创建对象需要访问某些信息,而这些信息不应该包含在复合类中;
- 对象的生命周期应该集中管理,以保证在整个程序中具有一致的行为。
实现:
- 定义一个工厂接口;
- 创建实现该接口的具体工厂类;
- 在客户端代码中,通过工厂接口创建对象,而不是直接实例化具体类。
4. 策略模式核心思想:定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换。
作用:
- 避免使用大量的条件语句;
- 提高算法的保密性和安全性;
- 避免使用多重条件转移语句。
实现:
- 定义策略接口;
- 创建实现该接口的具体策略类;
- 在客户端代码中,通过策略接口调用具体策略类的方法。
5. 装饰器模式核心思想:动态地给一个对象添加一些额外的职责。
作用:
- 动态地扩展一个对象的功能;
- 避免在高层模块中引入过多的子类;
- 避免使用继承带来的复杂性。
实现:
- 定义装饰器接口;
- 创建实现该接口的具体装饰器类;
- 在客户端代码中,通过装饰器接口动态地给对象添加职责。
6. 适配器模式核心思想:将一个类的接口转换成客户期望的另一个接口。
作用:
- 使原本由于接口不兼容而不能一起工作的类可以一起工作;
- 提高类的复用性;
- 灵活性好。
实现:
- 定义目标接口;
- 创建适配器类,实现目标接口,并在内部调用被适配者的方法;
- 在客户端代码中,通过目标接口调用适配器类的方法。
7. 外观模式核心思想:为子系统中的一组接口提供一个一致的界面。
作用:
- 简化客户端与子系统之间的交互;
- 提高子系统的独立性和可移植性;
- 降低系统的复杂度。
实现:
- 定义外观接口;
- 创建外观类,实现外观接口,并在内部调用子系统的方法;
- 在客户端代码中,通过外观接口调用外观类的方法。
8. 代理模式核心思想:为其他对象提供一种代理以控制对这个对象的访问。
作用:
- 远程代理:为对象在不同的地址空间提供局部代表;
- 虚拟代理:根据需要创建开销很大的对象;
- 保护代理:控制对原始对象的访问;
- 智能指引:在访问对象时执行一些附加操作。
实现:
- 定义主题接口;
- 创建代理类,实现主题接口,并在内部调用真实主题的方法;
- 在客户端代码中,通过主题接口调用代理类的方法。
9. 迭代器模式核心思想:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。
作用:
- 简化遍历聚合对象的过程;
- 支持多种遍历方式;
- 为遍历不同的聚合结构提供一个统一的接口。
实现:
- 定义迭代器接口;
- 创建具体迭代器类,实现迭代器接口;
- 在客户端代码中,通过迭代器接口遍历聚合对象。
10. 状态模式核心思想:允许对象在其内部状态改变时改变它的行为。
作用:
- 将与特定状态相关的行为局部化,并且将不同状态的行为分割开来;
- 使得状态转换显示化;
- 减少对象间的相互依赖。
实现:
- 定义状态接口;
- 创建具体状态类,实现状态接口;
- 在客户端代码中,通过状态接口调用具体状态类的方法。
11. 命令模式核心思想:将请求或操作封装为一个对象,从而使你可以参数化客户端对象,对请求排队或记录请求日志,以及支持可撤销的操作。
作用:
- 降低系统的耦合度;
- 新的命令可以很容易地加入到系统中;
- 可以比较容易地设计一个命令队列和宏命令(组合命令);
- 可以方便地实现对请求的Undo和Redo。
实现:
- 定义命令接口;
- 创建具体命令类,实现命令接口;
- 在客户端代码中,通过命令接口调用具体命令类的方法。
12. 模板方法模式核心思想:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。
作用:
- 提取公共代码,便于维护;
- 行为由父类控制,子类实现;
- 反向控制结构。
实现:
- 定义抽象类,包含模板方法和基本方法;
- 创建具体子类,实现基本方法;
- 在客户端代码中,通过抽象类调用模板方法。
13. 职责链模式核心思想:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。
作用:
- 降低耦合度;
- 增强了给对象指派职责的灵活性;
- 增强了系统的可扩展性。
实现:
- 定义处理者接口;
- 创建具体处理者类,实现处理者接口;
- 在客户端代码中,通过处理者接口调用具体处理者类的方法。
14. 中介者模式核心思想:用一个中介对象来封装一系列的对象交互。
作用:
- 减少对象间的耦合;
- 将多对多的关系转化为一对多的关系;
- 可以独立地改变和复用各个同事类。
实现:
- 定义中介者接口;
- 创建具体中介者类,实现中介者接口;
- 在客户端代码中,通过中介者接口调用具体中介者类的方法。
15. 备忘录模式核心思想:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
作用:
- 保持封装边界;
- 简化原发器;
- 简化了原发器;
- 使用备忘录可能代价很高;
- 维护备忘录可能代价很高。
实现:
- 定义备忘录接口;
- 创建具体备忘录类,实现备忘录接口;
- 在客户端代码中,通过备忘录接口调用具体备忘录类的方法。
16. 解释器模式核心思想:给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
作用: