当前位置: 首页 > news >正文

JavaScript 23种经典设计模式简介

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设计模式的理解和应用能力,不断提升自己的编程水平和开发技能。

相关文章:

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&#xff1a…...

聊一聊: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本身不支持这个命令&#xff0c;所以打算用快捷键实现 快捷键的功能是加粗光标前一个字目 1. Alt F8 打开宏&#xff0c;如果打不开可以尝试 Alt Fn F8 2. 输入 BoldPreviousCharacter 新建宏&#xff1a; Sub Bold…...

ROOT添加用户提示权限不够

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

关于使用svgIcon 菜单折叠 显示文字情况

使用的工具&#xff1a;vue2&#xff0c;ant design vue 问题&#xff1a; **解决&#xff1a;在<svg-icon> 外面包一层 <a-icon> ** 使用: 在 main.js 中&#xff1a;...

Python使用PDF相关组件案例详解

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

day53 图论章节刷题Part05(并查集理论基础、寻找存在的路径)

并查集理论基础 基础内容 并查集常用来解决连通性问题&#xff0c;主要有两个功能&#xff1a; 将两个元素添加到一个集合中判断两个元素在不在同一个集合 将三个元素A&#xff0c;B&#xff0c;C &#xff08;分别是数字&#xff09;放在同一个集合&#xff0c;其实就是将…...

鸿蒙next选择 Flutter 开发跨平台应用的原因

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

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这个网页中有搜索关键词 对指定网址进行监控&#xff0c;这里可以对ip进行扫描&…...

FTP、ISCSI、CHRONY、DNS、NFS、DOCKER、MARIADB、NGINX、PHP、CA各服务开启方法

2.1 FTP 服务 (vsftpd) 安装 vsftpd&#xff1a; sudo yum install vsftpd -y 启动并设置开机自启&#xff1a; sudo systemctl start vsftpdsudo systemctl enable vsftpd 配置文件位于 /etc/vsftpd/vsftpd.conf&#xff0c;可根据需要修改配置。 2.2 SCSI 服务 SCSI 配…...

抢先体验AI领域的新宠儿:Llama3.1,部署实战探索!

本文简介 就在今天&#xff0c;Meta 发布了 Llama 3.1&#xff0c;这次带来的中杯、大杯和超大杯3个版本。 从纸面数据来看&#xff0c;Llama 3.1 超大杯已经能跟 GPT-4 Omni、Claude 3.5 Sonnet 分庭抗礼了。 而中杯和大杯更是将同量级的对手摁在地上摩擦。 要知道&#xff…...

HarmonyOS基础:鸿蒙系统组件导航Navigation

大家好&#xff01;我是黑臂麒麟&#xff08;起名原因&#xff1a;一个出生全右臂自带纹身的高质量程序员&#x1f60f;&#xff09;&#xff0c;也是一位6&#xff08;约2个半坤年&#xff09;的前端&#xff1b; 学习如像练武功一样&#xff0c;理论和实践要相结合&#xff0…...

【K8S问题系列】Kubernetes 中 Pod 无法通过 Service 名称访问服务的 DNS 解析失败【已解决】

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

【下载工具】Internet Download Manager下载器介绍

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

如何打开/关闭 GitLab 的版本检查功能?

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

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...