js 常用12种设计模式

  1. 工厂模式
    
    
    
        
        
        
        01-工厂模式
    
    
        

    原理

    工厂模式通过使用工厂方法来创建对象,而不是直接使用new关键字。工厂方法根据输入参数的不同,决定创建哪个具体的对象实例,并将其返回。

    使用场景

    • 当需要创建多个相似的对象时
    • 当对象创建过程复杂或需要隐藏创建逻辑时
    • 当希望通过一个公共的接口来创建对象时

    优点

    • 将对象的创建与使用代码分离,客户端只需关注接口而不需要关心具体的对象创建过程
    • 可以通过工厂方法来创建不同类型的对象,提供灵活性和可扩展性
  2. 单例模式
    
    
    
        
        
        
        02-单例模式
    
    
        

    原理

    单例模式确保一个类只有一个实例,并提供全局访问点以获取该实例。它通过私有化构造函数,限制外部直接创建对象,并体用一个静态方法来获取或创建唯一的实例

    使用场景

    • 当需要一个全局对象来协调系统中的操作时
    • 当需要频繁访问同一个对象实例时
    • 当需要限制一个类只能有一个实例时

    优点

    • 提供了对唯一实例的全局访问,方便共享对象
    • 避免了重复创建实例的开销,节省了内存和资源

  3. 观察者模式
    
    
    
        
        
        
        03-观察者模式
    
    
        

    原理:

    观察者模式定义了对象之间一对多依赖关系,当一个对象的状态发生变化时,它的所有依赖者(观察者)都会被通知更新

    使用场景

    • 当一个对象的变化需要通知其它对象,以便它们可以做出相应的响应时。
    • 当对象之间的耦合度需要降低,使得它们之间可以独立的交互时

    优点

    • 实现了对象之间的松耦合,被观察者和观察者可以独立的演化和变化
    • 可以轻松添加或移除观察者,以实现动态的发布-订阅机制

  4. 发布订阅模式
    
    
    
        
        
        
        04-发布订阅模式
    
    
        

    原理

    发布-订阅模式类似于观察者模式,但是发布者(或称为主题)不会直接通知特定的订阅者,而是通过消息代理(或称为事件总线)来分发和传递消息。订阅者可以根据自身的需求订阅感兴趣的消息

    使用场景

    • 当一个对象的状态变化需要通知多个订阅者时
    • 当需要将发布者和订阅者解耦,使他们可以独立的演化时
    • 当希望在系统中引入中介层以提供更灵活的消息传递机制时

    有点

    • 解耦了发布者和订阅者,使他们可以独立的交互
    • 提供了更灵活的消息传递机制,可以实现更复杂的事件处理逻辑

  5. 原型模式
    
    
    
        
        
        
        05-原型模式
    
    
        

    原理

    原型模式通过克隆现有对象来创建新对象,而不是依赖显式的实例化过程。每一个对象都可以作为另一个对象的原型,新对象会继承原型对象的属性和方法

    使用场景

    • 当创建对象的过程比较昂贵或复杂时,而且新对象的创建与现有对象的状态无关时
    • 当希望通过修改原型对象来影响所有克隆对象时
    • 当需要避免使用new关键字直接实例化对象时

    优点

    • 避免了创建对象的昂贵或复杂过程,提高了性能和效率
    • 可以通过修改原型对象来影响所有克隆对象,实现了对象状态的批量修改

  6. 适配器模式
    
    
    
        
        
        
        06-适配器模式
    
    
        

    原理

    适配器模式将一个类的接口转换成另一个接口,以满足客户端的需求。它通过创建一个适配器类来实现接口转换,并在适配器类中调用被适配类的方法。

    使用场景

    • 当需要将一个已有类的接口转换成另一个接口时
    • 当希望通过一个统一的接口来使用多个不兼容的类时
    • 当需要在不影响现有代码的情况下,对已有类的方法进行扩展或修改时

    优点

    • 可以将已有类与新代码进行无缝衔接,使它们能够协同工作
    • 可以实现对象之间的接口转换,提供了灵活性和可扩展性

  7. 装饰者模式
    
    
    
        
        
        
        07-装饰者模式
    
    
        

    原理

    装饰者模式动态的给对象添加新的行为或功能,同时不改变其原始类结构。它通过创建一个装饰器类来包装原始对象,并在装饰器类中添加额外的行为

    使用场景

    • 当需要在不改变现有对象结构的情况下,动态地给对下个你添加新的行为时
    • 当希望通过透明的方式为对象添加功能,而不影响其使用方式和客户端代码时
    • 当不适合使用子类来扩展对象功能时

    优点

    • 可以透明的扩展对象的功能,而不会影响客户端代码
    • 允许通装饰器类组合和嵌套多个装饰器,实现复杂的功能组合

  8. 策略模式
    
    
    
        
        
        
        08-策略模式
    
    
        

    原理

    策略模式定义了一系列算法,将他们封装成独立的可互换的策略对象,并使得客户端可以在运行时动态的选择使用不同的策略。客户端通过与策略对下个你进行交互来实现不同的行为

    使用场景

    • 当需要在多个算法或行为之间进行动态选择时
    • 当希望将算法的实现与使用它的客户端代码分离,以便它们可以独立的演化和修改时
    • 当不希望使用大量的条件语句来处理不同的情况时

    优点

    • 实现了算法的封装和多态性,可以根据需要灵活的切换算法
    • 将算法的实现与使用它的客户端代码分离,使得他们可以独立演化和修改

  9. 模块模式
    
    
    
        
        
        
        09-模块模式
    
    
        

    原理

    模块模式使用函数作用域和闭包来封装和组织代码,实现模块化和私有性。它通过返回一个包含公共方法和属性的对象,类来实现对外部的封装

    使用场景

    • 当希望将相关的方法和属性封装在一个单独的对象中时
    • 当希望限制对方法和属性的访问,并保持私有性时
    • 当需要实现模块化,避免全局命名冲突和污染时

    优点

    • 将相关的方法和属性封装在一个单独的对象中,提供了组织和管理代码的方式
    • 通过闭包实现了私有性,可以隐藏内部的实现细节,防止外部访问和修改

  10. 代理模式
    
    
    
        
        
        
        10-代理模式
    
    
        

    原理

    代理模式为一个对象提供一个代理或占位符,并控制对其的访问。代理对象可以在访问被代理对象之前或之后添加额外的逻辑,如延迟加载、权限控制、缓存等

    使用场景

    • 当需要在访问对象之前或之后执行额外的操作时
    • 当希望通过代理控制对对象的访问权限时
    • 当需要延迟加载对象或实现缓存等功能时

    优点

    • 可以在访问对象之前或之后执行额外的操作,如延迟加载、权限控制、缓存等
    • 提供了对真实对象的访问控制,可以限制对对象的直接访问

  11. 迭代器模式
    
    
    
        
        
        
        11-迭代器模式
    
    
        

    原理

    迭代器模式提供了一种访问集合对象元素的方式,而无需暴露集合的内部结构。它将迭代逻辑封装在迭代器对象中,客户端通过迭代器来遍历集合

    使用场景

    • 当集合对象的内部结构可能经常变化时,使用迭代器可以减少对客户端代码的影响
    • 当需要对集合对下个你进行不同类型的遍历时,迭代器提供了统一的接口,使得遍历逻辑更加灵活和可扩展
    • 当需要在遍历过程中对集合元素进行筛选、过滤或转换时,可以通过迭代器来实现

    优点

    • 将遍历集合的责任从客户端代码中抽离出来,简化了客户端代码
    • 隐藏了集合的内部结构,提供了更好的封装性和安全性
    • 支持不同类型的集合,提供了统一的迭代接口

  12. 状态模式
    
    
    
        
        
        
        12-状态模式
    
    
        

    原理

    状态模式允许对象在内部状态发生改变时改变其行为,看起来就像是对象类发生了改变。它将每个状态封装在一个独立的类中,并允许对象在不同状态之间切换。

    使用场景

    • 当一个对象的行为取决于其内部状态,并在不同状态下具有不同行为时,可以使用状态模式来管理状态转换和行为。
    • 当需要在运行时根据条件动态的改变对象的行为时,状态模式提供了一种优雅的方式来实现
    • 当对象有大量的条件语句,而且随着状态的增加会变得更加复杂时,可以使用状态模式来简化代码结构

    优点

    • 将对象的状态和行为封装在独立的类中,提高了代码的可读性和可维护性
    • 避免了使用大量的条件语句来处理不同的状态,简化了代码结构
    • 新增或修改状态变得更加容易,不会对其他状态产生影响

你可能感兴趣的:(javascript,开发语言,ecmascript)