JavaScript 23种经典设计模式简介
23种JavaScript经典设计模式
JavaScript经典设计模式
通过之前的学习,我们知道设计模式是一种解决代码组织、代码复用和代码可维护性等问题的技术方法。它通过将代码以特定的方式组织起来,使代码结构更加清晰、可读性更高、易于维护和扩展。为了在开发中能更优秀的完成功能,我们应该学习并掌握常用的设计模式,JavaScript
总共有23种经典的设计模式,如上图所示:
我有一个JavaScript设计模式的专栏,目前已经写了21种设计模式,即将完成所有的经典设计模式案例,感兴趣的可以查看:
JavaScript 设计模式专栏https://blog.csdn.net/qq_24956515/category_12771776.html
创建型设计模式
创建型设计模式主要关注对象的创建过程,它们提供了一种机制来创建对象的实例,使代码与具体对象的创建过程解耦。
-
工厂模式(Factory Pattern):通过工厂函数或类来创建对象,隐藏具体实例化的过程,返回一个统一的接口。
-
抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而不需要具体指定每个对象的具体类。
-
建造者模式(Builder Pattern):将一个复杂对象的构建过程和它的表示分离,通过指挥者按照一定的顺序调用建造者来创建对象。
-
构造函数模式(Constructor Pattern):通过构造函数创建对象,使用关键字 new 实例化对象,可以在构造函数中定义属性和方法。
-
原型模式(Prototype Pattern):使用原型对象作为模板来创建对象,使用原型链继承属性和方法。
-
单例模式(Singleton Pattern):保证一个类只有一个实例,并提供一个全局访问点来获取该实例。
这些创建型设计模式都有各自的特点和适用场景,通过使用它们可以更好地组织和管理对象的创建过程,同时提供灵活性和可控性。
结构型设计模式
结构型设计模式主要关注对象之间的组织方式,以及对象之间的关系和交互方式。这些模式可以帮助我们实现更好的代码组、降低对象之间的耦合度,并提供灵活可扩展的设计。
-
适配器模式(Adapter Pattern):将一个类的接口转换成客期望的另一个接口,使原本因接口不兼容而不能一起工作的类可以一起工作。
-
装饰器模式(Decorator Pattern):动态地给对象添加额外的职责,可以封装原始对象,以便在执行其核心职责前后进行扩展。
-
代理模式(Proxy):为其他对象提供一种代理,以便控制对这个对象的访问。
-
外观模式(Facade Pattern):提供了一个统一的接口,用来简化底层系统的复杂性。
-
桥接模式(Bridge Pattern):将抽和实现分离开来,使它们可以独立变化,通过桥接来连接抽象和实现。
-
组合模式(Composite Pattern):将对象组合成树结构,以表示“分-整体”的层次结构,使客户端可以一致地处理单个对象和组合对象。
-
享元模式(Flyweight Pattern):通过共享对象,减少内存使用,提高性能。
-
过滤器模式(Filter Pattern):根据过滤条件过滤集合中的对象,只返回满足条件的对象。
-
门面模式(Facade Pattern):隐藏系统的复杂性,提供一个简单的统一接口来访问系统。
-
职责链模式(Chain of Responsibility Pattern):让多个对象都有机会处理请求,从而避免请求发送者与接收者之间的耦合关系。
这些结构型设计模式能够帮助我们更好地组织和代码,降低代码的耦合性,增加代码的可读性和可维护性,并提供灵活性和可扩展性。根据具体的需求和场景,选择适合的设计模式能够提升代码的质量和开发效率。
行为型设计模式
行为型设计模式主要关注对象之间的交互和通信方式,以及对象如何以一种灵活的方式完成任务和行为。这些模式可以帮助我们更好地组织和管理代码中的行为,实现可重用、可扩展和可维护的代码。
-
观察者模式(Observer Pattern):定义了一种对象之间的依赖关系,当一个对象的状态发生变化时,其相关的对象都会得到通知并自动更新。
-
迭代器模式(Iterator Pattern):提供一种方法,顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部结构。
-
策略模式(Strategy Pattern):定义一系列的算法,封装每个算法,并使它们可以互相替换,使得算法的变化不影响使用算法的客户端。
-
命令模式(Command Pattern):将一个请求封装成一个对象,从而使你可以用不同的请求对客户进行参数化。
-
备忘录模式(Memento Pattern):在不破坏对象封装的前提下,捕获内部对象的状态,并在对象外部保存这个状态,使得以后可以恢复对象到原来的状态。
-
状态模式(State Pattern):允许对象在其内部状态改变时改变其行为,对象看起来似乎修改了它的类。
-
解释器模式(Interpreter Pattern):定义语言文法的一种表示,用来解释语言中的句子。
-
中介者模式(Mediator Pattern):用一个中介对象来封装一系列的对象交互,使对象之间解耦。
-
职责链模式(Chain of Responsibility Pattern):解除发送者和接收者之的耦合,而使多个处理对象都有机会处理请求。
-
访问者模式(Visitor Pattern):在不改变对象结构的前提下,定义作用于对象结构中的各个元素操作。
-
模板方法模式(Template Method Pattern):定义一个操作中的算法的骨架,将一些步骤的实现延迟到子类中。
这些行为型设计模式能够提供一种灵活的方式来管理对象之间的交互和行为,使得代码更加可、可维护,并且具有良好的扩展性和重用性。根据实际需求和场景,选择适当的设计模式能提升代码的质量和开发效率。
为什么要学习设计模式
学习设计模式对于JS开发者来说非常重要,原因如下:
-
提高代码质量:设计模式是经过多年实践总结出来的最佳实践,它们可以帮助开发者写出更高质量、更可维护的代码。通过学习设计模式,开发者可以遵循一些通用的设计原则和模式,从而减少代码的重复、提高代码的可读性和可维护性。
-
促进团队协作:设计模式提供了一种共享的设计思想和术语,使得团队成员之间更容易沟通和理解彼此的代码。当团队成员都熟悉设计模式时,他们可以更方便地交流和合作,减少团队开发中的沟通和理解成本。
-
加快开发速度:设计模式提供了一些经过验证的解决方案,并且封装了一些通用的逻辑,可以减少开发时间并提高开发效率。开发者不需要从头设计和实现每一个功能,而是可以利用已有的设计模式来解决常见的问题。
-
更好的扩展性和灵活性:设计模式可以帮助开发者将代码解耦合,从而使得代码更加灵活、可扩展和可重用。通过使用设计模式,开发者可以轻松地修改和替换部分代码,而无需对整个应用进行大规模的修改。
-
跨语言应用:许多设计模式是通用的,不仅适用于JS,还适用于其他编程语言。通过学习设计模式,开发者可以提高自己的编程技能,并将这些技能应用于其他语言和项目中,提高自己的跨领域竞争力。
总之,学习设计模式可以帮助JS开发者写出更高质量、更可维护的代码,提高团队的协作效率,加快开发速度,并具备更好的扩展性和灵活性,使开发者能够更好地应对复杂的软件开发挑战。
如何更好的学习掌握设计模式
要更好地学习和掌握JS设计模式,可以考虑以下学习方法:
-
理论学习:先了解每个设计模式的基本概念、原理和使用场景。可以通过阅读书籍、参考经典的设计模式资料、观看相关的教学视频等途径来获取理论知识。
-
实践演练:学习设计模式最好的方式是通过实际项目的实践来应用和理解。尝试在自己的项目中应用设计模式,亲自编写代码,将理论知识转化为实际应用。
-
查阅案例:阅读和研究实际应用设计模式的案例代码,可以从开源项目、编程博客、GitHub等资源中找到相关的案例,了解设计模式在实际项目中的应用。
-
参与讨论和交流:加入相关的开发社区、论坛或团队,参与有关设计模式的讨论和交流。与其他开发者共同探讨设计模式的实际应用、解决方案和经验,从中学习和分享。
-
设计模式挑战:尝试解决一些与设计模式相关的编程挑战,以提升对设计模式的理解和应用能力。这些挑战可以是通过编程练习网站、在线编程比赛等方式来完成。
-
重构既有项目:将学到的设计模式知识应用到既有中进行重构,重构过程中可以尝试将一些重复代码进行抽象和优化,以提高代码的可读性和可维护性。
-
深入理解设计原则:设计模式背后往往有一些通用的设计原则,如单一职责原则、开闭原则、迪米特法则等。深入理解这些设计原则,可以帮助更好地理解和应用设计模式。
-
持续学习和实践:设计模式是一个广阔的领域,除了经典的设计模式外,还有很多其他的变种和延伸。要持续进行学习和实践,在实际项目中不断探索和应用更多的设计模式。
相信通过以上的学习方法,可以逐渐提高对JavaScript设计模式的理解和应用能力,不断提升自己的编程水平和开发技能。
相关文章:

JavaScript 23种经典设计模式简介
23种JavaScript经典设计模式 JavaScript经典设计模式 通过之前的学习,我们知道设计模式是一种解决代码组织、代码复用和代码可维护性等问题的技术方法。它通过将代码以特定的方式组织起来,使代码结构更加清晰、可读性更高、易于维护和扩展。为了在开发…...

位运算相关算法
一、异或运算介绍 1、性质介绍 异或运算(XOR,Exclusive OR)是一种位运算符。对于两个位进行异或操作,当且仅当这两个位不同时,结果为 1;如果相同,则结果为 0。 A B A^B00001 1 101110 任何数…...

解决:无法在此设备上激活Windows因为无法连接到你的组织的激活服务器
问题: 桌面右下角会出现这个东西👇 在设置里查看激活状态就会看到👇 解决方法 : 1.打开CMD 搜索CMD,然后以管理员身份运行 2.设置 KMS服务器 1)命令行输入: slmgr /skms kms.03k.org 然后…...

【Spring】——SpringBoot项目创建
阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 引入 一:介绍 二:Spring Boot项目创建 0:项目目录 1:…...

聊一聊:ChatGPT搜索引擎会取代谷歌和百度吗?
当地时间 10 月 31 日,OpenAI 正式推出了 ChatGPT 搜索功能,能实时、快速获取附带相关网页来源链接的答案。这一重大升级标志着其正式向谷歌的搜索引擎霸主地位发起挑战。 本周五我们聊一聊: 欢迎在评论区畅所欲言,分享你的观点~ …...

分布式中常见的问题及其解决办法
分布式中常见的问题及其解决办法 一、多个微服务要操作同一个存储在redis中的变量,如何确保这个变量的正确性 答: 在多个微服务操作同一个存储在Redis中的变量时,可以采取以下措施来确保变量的正确性: 1、使用Redis的事务&…...

HTML 基础标签——多媒体标签<img>、<object> 与 <embed>
文章目录 1. `<img>` 标签主要属性示例注意事项2. `<object>` 标签概述主要属性示例注意事项3. `<embed>` 标签概述主要属性示例注意事项小结在现代网页设计中,多媒体内容的使用变得越来越重要,因为它能够有效增强用户体验、吸引注意力并传达信息。HTML 提…...

word mathml 创建粗体字母快捷键
在 mathml 中达到latex中 \mathbf{A} 的效果 由于word本身不支持这个命令,所以打算用快捷键实现 快捷键的功能是加粗光标前一个字目 1. Alt F8 打开宏,如果打不开可以尝试 Alt Fn F8 2. 输入 BoldPreviousCharacter 新建宏: Sub Bold…...

ROOT添加用户提示权限不够
有个系统已经上线过了,之后测评整改要求不能用root启动中间件,我就想着添加一个普通用户,赋予指定目录权限,然后启动应用就行了 。 结果用root用户创建账号提示权限不够,确认了几遍,是root 命令前面加sud…...

关于使用svgIcon 菜单折叠 显示文字情况
使用的工具:vue2,ant design vue 问题: **解决:在<svg-icon> 外面包一层 <a-icon> ** 使用: 在 main.js 中:...

Python使用PDF相关组件案例详解
主要对pdfminer.six、pdfplumber、PyMuPDF、PyPDF2、PyPDF4、pdf2image、camelot-py七个PDF相关组件分别详解,具体使用案例演示 1. pdfminer.six pdfminer.six 是一个专门用来从 PDF 中提取文本的库,能够处理复杂的文本布局,适合用于文本解析…...

day53 图论章节刷题Part05(并查集理论基础、寻找存在的路径)
并查集理论基础 基础内容 并查集常用来解决连通性问题,主要有两个功能: 将两个元素添加到一个集合中判断两个元素在不在同一个集合 将三个元素A,B,C (分别是数字)放在同一个集合,其实就是将…...

鸿蒙next选择 Flutter 开发跨平台应用的原因
在移动操作系统的竞争中,鸿蒙(HarmonyOS)自从发布以来便吸引了广泛的关注。作为华为主导的操作系统,鸿蒙的设计初衷是打破平台壁垒,实现设备间的无缝连接与应用共享。然而,要实现这一目标,仅仅依…...

shodan6-7---清风
shodan6-7 1.shodan网页版 以cve-2019-0708漏洞指纹特征为例 "\x03\x00\x00\x0b\x06\xd0\x00\x00\x124\x00"在这里插入图片描述 搜索命令参考 https://www.shodan.io/search/filters这个网页中有搜索关键词 对指定网址进行监控,这里可以对ip进行扫描&…...

FTP、ISCSI、CHRONY、DNS、NFS、DOCKER、MARIADB、NGINX、PHP、CA各服务开启方法
2.1 FTP 服务 (vsftpd) 安装 vsftpd: sudo yum install vsftpd -y 启动并设置开机自启: sudo systemctl start vsftpdsudo systemctl enable vsftpd 配置文件位于 /etc/vsftpd/vsftpd.conf,可根据需要修改配置。 2.2 SCSI 服务 SCSI 配…...

抢先体验AI领域的新宠儿:Llama3.1,部署实战探索!
本文简介 就在今天,Meta 发布了 Llama 3.1,这次带来的中杯、大杯和超大杯3个版本。 从纸面数据来看,Llama 3.1 超大杯已经能跟 GPT-4 Omni、Claude 3.5 Sonnet 分庭抗礼了。 而中杯和大杯更是将同量级的对手摁在地上摩擦。 要知道ÿ…...

HarmonyOS基础:鸿蒙系统组件导航Navigation
大家好!我是黑臂麒麟(起名原因:一个出生全右臂自带纹身的高质量程序员😏),也是一位6(约2个半坤年)的前端; 学习如像练武功一样,理论和实践要相结合࿰…...

【K8S问题系列】Kubernetes 中 Pod 无法通过 Service 名称访问服务的 DNS 解析失败【已解决】
在 Kubernetes 中,Service 提供了一种稳定的方式,通过名称访问一组 Pod。当其他 Pod 无法通过 Service 名称访问服务,并且出现 DNS 解析失败时,通常会导致应用无法正常工作。本文将详细分析此问题的常见原因及其解决方案。 一、问…...

【下载工具】Internet Download Manager下载器介绍
Internet Download Manager(简称IDM)作为一款功能强大的下载管理软件,以其高效、稳定的特点受到了广大用户的青睐。本文将为您详细介绍IDM的功能特性以及具体的使用方法。 功能特性 加速下载:IDM通过多线程下载技术,…...

如何打开/关闭 GitLab 的版本检查功能?
本文分享如何打开/关闭 GitLab 的版本检查功能。 极狐GitLab 是 GitLab 的中国发行版【https://dl.gitlab.cn/ncecn6kb】,中文版本对中国用户更友好,文章以私有化部署的极狐GitLab 实例来演示版本检查功能的开启和关闭。强烈不建议关闭该功能࿰…...

java-web-day13-事务管理+spring aop
事务管理: 事务回滚 默认情况下,只有出现runtimeException(运行时异常)才回滚, 而如果出现其他异常,例如受检异常, 就不会回滚事务, 不过可以加上rollbackfor属性用于控制出现何种异常类型, 回滚事务 事务传播: 当一个事务方法被另一个事务方法调用时, 这个事务方法应该如何进行…...

MySQL详细安装教程
一、从MySQL官网安装 可以翻译成中文看起来就舒服多了 下载并打开安装包,能看到版本是8.0.36,双击运行或者右键选择打开,打开后是一个安装向导,这个安装向导会先帮我们安装一个 mysql-installer 的程序,再通过该程序安…...

文件系统和日志管理
一、文件系统 1.概述 文件系统:文件系统提供了一个接口,用户用来访问硬件设备(硬盘)。硬件设备上对文件的管理。文件存储在硬盘上,硬盘最小的存储单位是512字节(扇区)。文件在硬盘上的最小存储…...

【LeetCode】【算法】208. 实现 Trie (前缀树)
LeetCode 208. 实现 Trie (前缀树) 题目描述 Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补全和拼写检查。 请你实现 Trie 类&…...

libaom 源码分析:帧间运动矢量预测
AV1 帧间运动矢量预测原理 运动矢量可以被相邻块预测,这些相邻块可以是空域相邻块,或位于参考帧中的时域相邻块;通过检查所有这些块,将确定一组运动矢量预测器,并用于编码运动矢量信息。空域运动矢量预测 两组空域相邻块可以被利用寻找空域 MV 预测器,第一组包括当前块的…...

Android TextView自动换行文本显示不全解决
某些情况下,TextView自动换行后,会出现每行结尾处显示不全的问题, 如图: 常见解决方案: 设置TextView的“ellipsize”属性为“end” 实测无效!将TextView外部的Layout改为RelativeLayout 实测无效&…...

【LeetCode】【算法】394. 字符串解码
LeetCode 394. 字符串解码 题目描述 给定一个经过编码的字符串,返回它解码后的字符串。 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。 你可以认为输入字符串总是有效的;输入字…...

最新整理:Selenium自动化测试面试题
1.selenium中如何判断元素是否存在? find_elements查找到的元素个数为0,find_element报错意味着元素不存在 2.如何判断元素是否出现? 判断元素是否出现,存在两种情况,一种是该元素压根就没有,自然不会出现;另外一种是有这样的…...

外包干了2年,快要废了。。。
先说一下自己的情况,普通本科,在外包干了2年多的功能测试,这几年因为大环境不好,我整个人心惊胆战的,怕自己卷铺盖走人了,我感觉自己不能够在这样蹉跎下去了,长时间呆在一个舒适的环境真的会让一…...

乐尚代驾十订单支付seata、rabbitmq异步消息、redisson延迟队列
账单信息 司机结束代驾之后,生成账单(包含账单信息和分账信息)司机发送账单给乘客乘客获取账单之后,进行支付 获取账单信息 order_bill表记录的账单信息,我们直接获取即可 Operation(summary "根据订单id获取…...