JavaScript 23种经典设计模式简介

news2024/12/28 0:06:31

fileOf7174.png

 

23种JavaScript经典设计模式

JavaScript经典设计模式

通过之前的学习,我们知道设计模式是一种解决代码组织、代码复用和代码可维护性等问题的技术方法。它通过将代码以特定的方式组织起来,使代码结构更加清晰、可读性更高、易于维护和扩展。为了在开发中能更优秀的完成功能,我们应该学习并掌握常用的设计模式,JavaScript总共有23种经典的设计模式,如上图所示:

我有一个JavaScript设计模式的专栏,目前已经写了21种设计模式,即将完成所有的经典设计模式案例,感兴趣的可以查看:

JavaScript 设计模式专栏icon-default.png?t=O83Ahttps://blog.csdn.net/qq_24956515/category_12771776.html

创建型设计模式

创建型设计模式主要关注对象的创建过程,它们提供了一种机制来创建对象的实例,使代码与具体对象的创建过程解耦。

  1. 工厂模式(Factory Pattern):通过工厂函数或类来创建对象,隐藏具体实例化的过程,返回一个统一的接口。

  2. 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而不需要具体指定每个对象的具体类。

  3. 建造者模式(Builder Pattern):将一个复杂对象的构建过程和它的表示分离,通过指挥者按照一定的顺序调用建造者来创建对象。

  4. 构造函数模式(Constructor Pattern):通过构造函数创建对象,使用关键字 new 实例化对象,可以在构造函数中定义属性和方法。

  5. 原型模式(Prototype Pattern):使用原型对象作为模板来创建对象,使用原型链继承属性和方法。

  6. 单例模式(Singleton Pattern):保证一个类只有一个实例,并提供一个全局访问点来获取该实例。

这些创建型设计模式都有各自的特点和适用场景,通过使用它们可以更好地组织和管理对象的创建过程,同时提供灵活性和可控性。

结构型设计模式

结构型设计模式主要关注对象之间的组织方式,以及对象之间的关系和交互方式。这些模式可以帮助我们实现更好的代码组、降低对象之间的耦合度,并提供灵活可扩展的设计。

  1. 适配器模式(Adapter Pattern):将一个类的接口转换成客期望的另一个接口,使原本因接口不兼容而不能一起工作的类可以一起工作。

  2. 装饰器模式(Decorator Pattern):动态地给对象添加额外的职责,可以封装原始对象,以便在执行其核心职责前后进行扩展。

  3. 代理模式(Proxy):为其他对象提供一种代理,以便控制对这个对象的访问。

  4. 外观模式(Facade Pattern):提供了一个统一的接口,用来简化底层系统的复杂性。

  5. 桥接模式(Bridge Pattern):将抽和实现分离开来,使它们可以独立变化,通过桥接来连接抽象和实现。

  6. 组合模式(Composite Pattern):将对象组合成树结构,以表示“分-整体”的层次结构,使客户端可以一致地处理单个对象和组合对象。

  7. 享元模式(Flyweight Pattern):通过共享对象,减少内存使用,提高性能。

  8. 过滤器模式(Filter Pattern):根据过滤条件过滤集合中的对象,只返回满足条件的对象。

  9. 门面模式(Facade Pattern):隐藏系统的复杂性,提供一个简单的统一接口来访问系统。

  10. 职责链模式(Chain of Responsibility Pattern):让多个对象都有机会处理请求,从而避免请求发送者与接收者之间的耦合关系。

这些结构型设计模式能够帮助我们更好地组织和代码,降低代码的耦合性,增加代码的可读性和可维护性,并提供灵活性和可扩展性。根据具体的需求和场景,选择适合的设计模式能够提升代码的质量和开发效率。

行为型设计模式

行为型设计模式主要关注对象之间的交互和通信方式,以及对象如何以一种灵活的方式完成任务和行为。这些模式可以帮助我们更好地组织和管理代码中的行为,实现可重用、可扩展和可维护的代码。

  1. 观察者模式(Observer Pattern):定义了一种对象之间的依赖关系,当一个对象的状态发生变化时,其相关的对象都会得到通知并自动更新。

  2. 迭代器模式(Iterator Pattern):提供一种方法,顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部结构。

  3. 策略模式(Strategy Pattern):定义一系列的算法,封装每个算法,并使它们可以互相替换,使得算法的变化不影响使用算法的客户端。

  4. 命令模式(Command Pattern):将一个请求封装成一个对象,从而使你可以用不同的请求对客户进行参数化。

  5. 备忘录模式(Memento Pattern):在不破坏对象封装的前提下,捕获内部对象的状态,并在对象外部保存这个状态,使得以后可以恢复对象到原来的状态。

  6. 状态模式(State Pattern):允许对象在其内部状态改变时改变其行为,对象看起来似乎修改了它的类。

  7. 解释器模式(Interpreter Pattern):定义语言文法的一种表示,用来解释语言中的句子。

  8. 中介者模式(Mediator Pattern):用一个中介对象来封装一系列的对象交互,使对象之间解耦。

  9. 职责链模式(Chain of Responsibility Pattern):解除发送者和接收者之的耦合,而使多个处理对象都有机会处理请求。

  10. 访问者模式(Visitor Pattern):在不改变对象结构的前提下,定义作用于对象结构中的各个元素操作。

  11. 模板方法模式(Template Method Pattern):定义一个操作中的算法的骨架,将一些步骤的实现延迟到子类中。

这些行为型设计模式能够提供一种灵活的方式来管理对象之间的交互和行为,使得代码更加可、可维护,并且具有良好的扩展性和重用性。根据实际需求和场景,选择适当的设计模式能提升代码的质量和开发效率。

为什么要学习设计模式

学习设计模式对于JS开发者来说非常重要,原因如下:

  1. 提高代码质量:设计模式是经过多年实践总结出来的最佳实践,它们可以帮助开发者写出更高质量、更可维护的代码。通过学习设计模式,开发者可以遵循一些通用的设计原则和模式,从而减少代码的重复、提高代码的可读性和可维护性。

  2. 促进团队协作:设计模式提供了一种共享的设计思想和术语,使得团队成员之间更容易沟通和理解彼此的代码。当团队成员都熟悉设计模式时,他们可以更方便地交流和合作,减少团队开发中的沟通和理解成本。

  3. 加快开发速度:设计模式提供了一些经过验证的解决方案,并且封装了一些通用的逻辑,可以减少开发时间并提高开发效率。开发者不需要从头设计和实现每一个功能,而是可以利用已有的设计模式来解决常见的问题。

  4. 更好的扩展性和灵活性:设计模式可以帮助开发者将代码解耦合,从而使得代码更加灵活、可扩展和可重用。通过使用设计模式,开发者可以轻松地修改和替换部分代码,而无需对整个应用进行大规模的修改。

  5. 跨语言应用:许多设计模式是通用的,不仅适用于JS,还适用于其他编程语言。通过学习设计模式,开发者可以提高自己的编程技能,并将这些技能应用于其他语言和项目中,提高自己的跨领域竞争力。

总之,学习设计模式可以帮助JS开发者写出更高质量、更可维护的代码,提高团队的协作效率,加快开发速度,并具备更好的扩展性和灵活性,使开发者能够更好地应对复杂的软件开发挑战。

如何更好的学习掌握设计模式

要更好地学习和掌握JS设计模式,可以考虑以下学习方法:

  1. 理论学习:先了解每个设计模式的基本概念、原理和使用场景。可以通过阅读书籍、参考经典的设计模式资料、观看相关的教学视频等途径来获取理论知识。

  2. 实践演练:学习设计模式最好的方式是通过实际项目的实践来应用和理解。尝试在自己的项目中应用设计模式,亲自编写代码,将理论知识转化为实际应用。

  3. 查阅案例:阅读和研究实际应用设计模式的案例代码,可以从开源项目、编程博客、GitHub等资源中找到相关的案例,了解设计模式在实际项目中的应用。

  4. 参与讨论和交流:加入相关的开发社区、论坛或团队,参与有关设计模式的讨论和交流。与其他开发者共同探讨设计模式的实际应用、解决方案和经验,从中学习和分享。

  5. 设计模式挑战:尝试解决一些与设计模式相关的编程挑战,以提升对设计模式的理解和应用能力。这些挑战可以是通过编程练习网站、在线编程比赛等方式来完成。

  6. 重构既有项目:将学到的设计模式知识应用到既有中进行重构,重构过程中可以尝试将一些重复代码进行抽象和优化,以提高代码的可读性和可维护性。

  7. 深入理解设计原则:设计模式背后往往有一些通用的设计原则,如单一职责原则、开闭原则、迪米特法则等。深入理解这些设计原则,可以帮助更好地理解和应用设计模式。

  8. 持续学习和实践:设计模式是一个广阔的领域,除了经典的设计模式外,还有很多其他的变种和延伸。要持续进行学习和实践,在实际项目中不断探索和应用更多的设计模式。

相信通过以上的学习方法,可以逐渐提高对JavaScript设计模式的理解和应用能力,不断提升自己的编程水平和开发技能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2235177.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LangChain Ollama实战文献检索助手(二)少样本提示FewShotPromptTemplate示例选择器

本期是用样例来提示大模型生成我们想要的答案。即在输入中给定提示的样例,以及提示模板,然后匹配较相关的样例进行文献综述。 创建示例样本FewShotPromptTemplate 这里我用GTP-o1生成了几个回答,作为样本 samples [{"theme": &…

R语言*号标识显著性差异判断组间差异是否具有统计意义

前言 该R代码用于对Iris数据集进行多组比较分析,探讨不同鸢尾花品种在不同测量变量(花萼和花瓣长度与宽度)上的显著性差异。通过将数据转换为长格式,并利用ANOVA和Tukey检验,代码生成了不同品种间的显著性标记&#x…

AUTOSAR CP NVRAM Manager规范导读

一、NVRAM Manager功能概述 NVRAM Manager是AUTOSAR(AUTomotive Open System ARchitecture)框架中的一个模块,负责管理非易失性随机访问存储器(NVRAM)。它提供了一组服务和API,用于在汽车环境中存储、维护和恢复NV数据。以下是NVRAM Manager的一些关键功能: 数据存储和…

PDF编辑工具Adobe Acrobat DC 2023安装教程(附安装包)

Adobe Acrobat DC 2023 是 Adobe 公司推出的一款功能强大的 PDF 文档处理软件。它不仅支持创建、编辑和签署 PDF 文件,还提供了丰富的工具来管理和优化这些文件。以下是 Acrobat DC 2023 的一些主要特点: 1.PDF 创建与编辑:用户可以直接从多…

Tornado简单使用

Tornado简单使用 1 介绍 Tornado 是一个基于Python的Web服务框架和 异步网络库,它最初由 FriendFeed 开发,后来被 Facebook 收购并开源,通过利用非阻塞网络 I/O, Tornado 可以承载成千上万的活动连接,完美的实现了 长连接、WebS…

基于SpringBoot的城镇保障性住房管理策略

3系统分析 3.1可行性分析 通过对本城镇保障性住房管理系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本城镇保障性住房管理系统采用SSM框架,JA…

【万字详解】如何在微信小程序的 Taro 框架中设置静态图片 assets/image 的 Base64 转换上限值

设置方法 mini 中提供了 imageUrlLoaderOption 和 postcss.url 。 其中: config.limit 和 imageUrlLoaderOption.limit 服务于 Taro 的 MiniWebpackModule.js , 值的写法要 ()KB * 1024。 config.maxSize 服务于 postcss-url 的…

[实战-11] FlinkSql 设置时区对TIMESTAMP和TIMESTAMP_LTZ的影响

table.local-time-zone table.local-time-zoneDataStream-to-Table Conversion(拓展知识)代码测试flinksql代码执行结果截图1. Asia/Shanghai 结果如下2. UTC结果如下 table.local-time-zone table.local-time-zone可用于设置flinksql的时区。 flink的内…

Bypassuac之白名单结合注册表方式

参考 Bypass UAC 原来这么简单 本章记录一下系统白名单文件结合注册表bypassuac,uac这个东西并不是Windows设置的防御机制而是相当于保护机制,只是用来控制用户行为的,弹个窗来提醒一下用户的行为,和直接的杀软是不一样的性质&am…

【力扣打卡系列】单调栈

坚持按题型打卡&刷&梳理力扣算法题系列,语言为go,Day20 单调栈 题目描述 解题思路 单调栈 后进先出 记录的数据加在最上面丢掉数据也先从最上面开始 单调性 记录t[i]之前会先把所有小于等于t[i]的数据丢掉,不可能出现上面大下面小的…

如何通过CDN加速提升电商网站双十一购物节用户体验

随着双十一购物节的到来,电商平台迎来了一年中流量的高峰。各大电商平台如天猫、京东和抖音等纷纷推出了全新的促销活动和玩法。在这场购物狂欢中,用户体验成为了电商网站能否脱颖而出的关键。而CDN(内容分发网络)加速服务&#x…

Linux信号_信号的产生

信号概念 信号是进程之间事件异步通知的一种方式,属于软中断。 异步:在异步操作中,任务可以独立执行。一个任务的开始或完成不依赖于其他任务的状态。 同步:在同步操作中,任务之间的执行是相互依赖的。一个任务必须等待…

Docker学习—Docker核心概念总结

核心概念总结 容器:容器就是将应用运行所需的所有内容比如代码、运行时环境,进行打包和隔离。 容器和虚拟机的对比 虚拟机是在同一个硬件上虚拟化出多个操作系统(OS)实例。 容器是在操作系统上进行虚拟化,用于隔离…

51单片机教程(六)- LED流水灯

1 项目分析 基于点亮LED灯、LED灯闪烁,扩展到构成最简单、花样流水灯。 2 技术准备 1 流水灯硬件及原理图 流水灯是由多个LED灯组成的 2 C语言知识点 数组 数组声明:长度不可变 数据类型 数组名称[长度n] // 整数型默认为0,小数型默认…

供热的一些基础技术数据

1、应该了解的几个实用数据:(1)室内采暖达标温度182℃(2)建筑面积采暖热负荷 4060kcal/h㎡(4570W/㎡)(3)建筑面积采暖所需合理流量 2.53.5kg/h㎡(节能建筑12 kg/h㎡)(4)一次网严寒期外网总供、回水温度5570℃(5)热网的补水量应小于热网循环量的1%(6)1蒸吨的热量可供11.5 万平方…

【1个月速成Java】基于Android平台开发个人记账app学习日记——第7天,申请阿里云SMS短信服务SDK

系列专栏链接如下,方便跟进: https://blog.csdn.net/weixin_62588253/category_12821860.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12821860&sharereferPC&sharesourceweixin_62588253&sharefromfrom_link 同时篇幅…

A02、JVM性能监测调优

1、JVM内存模型 1.1、介绍 JVM 自动内存分配管理机制的好处很多,但实则是把双刃剑。这个机制在提升 Java 开发效率的同时,也容易使 Java 开发人员过度依赖于自动化,弱化对内存的管理能力,这样系统就很容易发生 JVM 的堆内存异常&…

钉钉调试微应用整理2

第一步 新建应用 钉钉开放平台](https://open-dev.dingtalk.com/) 去新增应用 第二步 配置应用信息 把本地代码运行起来&#xff0c;并设置本地地址 第三步 在本地代码添加调试命令 这里有2中添加方式 哪一种都可以 方式一&#xff1a; index.html页面中 <!DOCTYPE h…

《TCP/IP网络编程》学习笔记 | Chapter 3:地址族与数据序列

《TCP/IP网络编程》学习笔记 | Chapter 3&#xff1a;地址族与数据序列 《TCP/IP网络编程》学习笔记 | Chapter 3&#xff1a;地址族与数据序列分配给套接字的IP地址和端口号网络地址网络地址分类和主机地址边界用于区分套接字的端口号数据传输过程示例 地址信息的表示表示IPv4…

飞牛fnOs内网穿透-使用Lucky实现ipv6动态解析+HTTPS访问NAS服务

&#x1f9ed;Lucky官方介绍 Lucky最初是作为一个小工具&#xff0c;由开发者为自己的个人使用而开发&#xff0c;用于替代socat&#xff0c;在小米路由AX6000官方系统上实现公网IPv6转内网IPv4的功能。Lucky的设计始终致力于让更多的Linux嵌入式设备运行&#xff0c;以实现或…