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

Javascript_设计模式(二)

什么是迭代器模式?一般用在什么场景?

迭代器模式是一种行为型设计模式,它用于提供一种顺序访问聚合对象中各个元素的方法,而又不暴露该对象的内部表示。通过使用迭代器模式,可以遍历一个聚合对象,而无需关心该对象的内部结构和实现细节。

使用场景

  • 当你需要访问一个聚合对象中的元素,但不想暴露其内部结构时,可以使用迭代器模式。例如,遍历一个列表、集合或数组等数据结构时,可以使用迭代器模式来隐藏底层数据结构的实现细节,提供统一的遍历接口。

什么是模板方法模式?一般用在什么场景?

模板方法模式定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现。它使得子类在不改变算法结构的前提下,可以重新定义算法的某些步骤。

使用场景

  • 父类视角:一次性实现一个算法不变的部分,并将可变部分留给子类实现。
  • 子类视角:各个子类中公共部分被提取出来,集中到一个公共的父类中,避免代码重复。

例如,在软件开发中,经常需要执行一系列步骤来完成某个任务,这些步骤中有些是不变的,有些是可变的。此时,可以使用模板方法模式来定义一个算法的骨架,将不变的部分放在父类中实现,将可变的部分留给子类实现。

什么是命令模式?一般用在什么场景?

命令模式将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。两者通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。

使用场景

  • 需要将请求排队、记录请求日志、支持可撤销操作等。
  • 在系统需要将请求发送者和请求接收者解耦时,可以使用命令模式。例如,在GUI编程中,可以使用命令模式来将用户的操作封装为命令对象,然后将其传递给相应的处理函数或对象进行处理。

什么是状态模式?一般用在什么场景?

状态模式允许对象在内部状态改变时改变它的行为,对象看起来像是改变了它的类。

使用场景

  • 一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为。
  • 代码中包含大量与对象状态有关的条件语句,例如,一个操作中含有庞大的多分支语句,且这些分支依赖于该对象的状态。

例如,在开发一个游戏时,游戏角色的状态可能会随着游戏的进行而改变(如空闲、行走、战斗等),每种状态下角色的行为也会有所不同。此时,可以使用状态模式来将角色的不同状态及其对应的行为封装到不同的状态类中,从而实现状态的切换和行为的改变。

什么是策略模式?一般用在什么场景?

策略模式定义了一系列算法,并将每一个算法封装起来,使它们可以互换。策略模式使得算法可以独立于使用它的客户端而变化。

使用场景

  • 当实现某一个功能存在多个算法或者策略时,可以根据环境或者条件的不同选择不同的算法或者策略来实现某个功能。
  • 一个系统需要动态地在几种算法中选择一种时,可以将每个算法封装到策略类中。

例如,在开发一个电商网站时,可能会有多种不同的支付策略(如支付宝支付、微信支付、银行卡支付等)。此时,可以使用策略模式来将这些不同的支付策略封装到不同的策略类中,然后根据用户的支付选择来动态地选择相应的支付策略。

什么是责任链模式?一般用在什么场景?

责任链模式使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。

使用场景

  • 需要将请求和处理分开,使得请求的处理过程更加灵活和可扩展。
  • 当有多个对象可以处理同一个请求,但具体由哪个对象处理是运行时决定的。

例如,在开发一个Web应用时,可能会有多个过滤器(如身份验证过滤器、日志记录过滤器等)来对用户的请求进行处理。此时,可以使用责任链模式来将这些过滤器连成一条链,并根据需要动态地添加或删除过滤器。

什么是中介者模式?一般用在什么场景?

中介者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使他们可以松散耦合。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用。

使用场景

  • 当对象之间的交互操作很多且每个对象的行为操作都彼此依赖时,为防止在修改一个对象的行为时同时涉及修改很多其他对象的行为,可采用中介者模式来解决紧耦合问题。

例如,在开发一个聊天室应用时,可能会有多个用户同时在线并相互发送消息。此时,可以使用中介者模式来将用户之间的消息传递过程封装到一个中介者对象中,从而实现用户之间的松散耦合和消息的高效传递。

什么是访问者模式?一般用在什么场景?

访问者模式是一种将数据操作与数据结构分离的设计模式。它允许你定义一个新的操作,而不修改现有的类层次结构。

使用场景

  • 当一个复杂的对象结构包含多个类的对象,并且希望在不修改这些类的情况下增加新的操作。

例如,在开发一个图形编辑器时,可能会有多种不同的图形对象(如圆形、矩形、三角形等)。此时,可以使用访问者模式来定义一个新的操作(如计算图形的面积或周长),而无需修改现有的图形类。

什么是备忘录模式?一般用在什么场景?

备忘录模式在不破坏封装性的前提下,捕获并恢复对象的内部状态。

使用场景

  • 需要保存和恢复对象的状态的场景。例如,在开发一个文本编辑器时,可以使用备忘录模式来保存和恢复文档的编辑状态。

以下是对前端面试题中各个概念及问题的详细回答:

单一职责原则

  • 定义:单一职责原则(Single Responsibility Principle,SRP)规定一个类应该只有一个发生变化的原因。它要求一个类或者模块应该有且只有一个改变的原因,即一个类只做一件事情,并将这件事情做好。
  • 应用场景:在大型复杂系统中,应用单一职责原则能提高代码质量和可维护性。通过将类的职责分解为多个独立的类,可以降低类的复杂度,提高代码的可读性和可维护性。

开闭原则

  • 定义:开闭原则(Open Closed Principle,OCP)是面向对象程序设计中的一个基本原则。它的核心思想是,一个软件实体(如类、模块或函数)应该对扩展开放,对修改封闭。
  • 应用场景:开闭原则主要应用于软件架构设计中,帮助设计出更加灵活和可扩展的系统结构。通过模块化设计,将不同的功能模块化,每个模块内部的变化不会影响到其他模块,从而实现系统的可扩展性。

里氏替换原则

  • 定义:里氏替换原则(Liskov Substitution Principle,LSP)强调在软件设计中,基类对象可以被其子类对象替换,而不会影响程序的正确性。
  • 应用场景:里氏替换原则在继承体系设计中尤为重要。它确保子类能够替换父类而不会影响系统的正确性,从而帮助构建一个更稳定、可扩展的系统。

接口隔离原则

  • 定义:接口隔离原则要求客户端不应该依赖它不需要的接口,即类间的依赖关系应该建立在最小的接口上。
  • 应用场景:接口隔离原则主要用于将臃肿的接口拆分为独立的几个接口,使得客户端只需要依赖它们需要的接口。这有助于降低代码的耦合度,提高系统的灵活性和可维护性。

依赖倒置原则

  • 定义:依赖倒置原则(Dependency Inversion Principle,DIP)指导我们如何构建松耦合、易于扩展和维护的系统。它要求高层模块不应该依赖于低层模块,两者都应该依赖于抽象。
  • 应用场景:依赖倒置原则在面向对象设计中非常重要。它通过将依赖关系建立在抽象之上,减少了模块间的直接依赖,提高了系统的灵活性和可扩展性。

迪米特法则

  • 定义:迪米特法则(Law of Demeter)又称最少知识原则(Principle of Least Knowledge),它强调对象之间的松耦合和封装性。一个对象应该尽可能少地了解其他对象的细节,只与其直接的朋友进行通信。
  • 应用场景:迪米特法则在面向对象设计中用于降低系统的复杂度和依赖关系。通过减少对象之间的交互和依赖,提高了系统的可维护性和可扩展性。

设计模式

  • 定义:设计模式是在软件工程中反复出现的问题的最佳解决方案。它不是一种具体的“技术”,而是一种“思想”,是从众多成功案例中总结出的经验。

  • 常见的设计模式

    • 单例模式:确保一个类只有一个实例,并提供全局访问点。
    • 工厂模式:定义一个用于创建对象的接口,由子类决定实例化哪个类。
    • 适配器模式:将一个类的接口转换成客户希望的另一个接口。
    • 策略模式:定义一系列算法,将每个算法都封装起来,并使它们可以互换。
    • 代理模式:为其他对象提供一种代理以控制对这个对象的访问。
    • 观察者模式:定义对象之间的一对多依赖关系,使得一个对象的状态改变会通知其依赖者。
  • 使用原因:使用设计模式可以提高代码的可重用性、可读性和可维护性。它帮助我们构建出更加灵活、可扩展和易于维护的系统。

综上所述,这些原则和设计模式在前端开发中同样具有重要意义。它们不仅有助于提高代码质量,还能降低系统的复杂度和维护成本。

相关文章:

Javascript_设计模式(二)

什么是迭代器模式?一般用在什么场景? 迭代器模式是一种行为型设计模式,它用于提供一种顺序访问聚合对象中各个元素的方法,而又不暴露该对象的内部表示。通过使用迭代器模式,可以遍历一个聚合对象,而无需关心该对象的内部结构和…...

时间同步服务器

1、时间同步服务:在多台主机协作时,确保时间同步,防止时间不一致造成的故障。 2、时间按同步实现: ntp 、chrony 3、命令:timedatectl timedatectl set-time "2024-02-13 10:41:55" timedatect…...

react+hook+vite项目使用eletron打包成桌面应用+可以热更新

使用Hooks-Admin的架构 Hooks-Admin: 🚀🚀🚀 Hooks Admin,基于 React18、React-Router V6、React-Hooks、Redux、TypeScript、Vite2、Ant-Design 开源的一套后台管理框架。https://gitee.com/HalseySpicy/Hooks-Adminexe桌面应用…...

STM32 ADC --- DMA乒乓缓存

STM32 ADC — DMA乒乓缓存 文章目录 STM32 ADC --- DMA乒乓缓存软件切换实现乒乓利用DMA双缓冲实现乒乓 通过cubeMX配置生成HAL工程这里使用的是上篇文章(STM32 ADC — DMA采样)中生成的工程配置 软件切换实现乒乓 cubeMX默认生成的工程中是打开DMA中断…...

SpringCloud基础 入门级 学习SpringCloud 超详细(简单通俗易懂)

Spring Cloud 基础入门级学习 超详细(简单通俗易懂) 一、SpringCloud核心组件第一代:SpringCloud Netflix组件第二代:SpringCloud Alibaba组件SpringCloud原生组件 二、SpringCloud体系架构图三、理解分布式与集群分布式集群 四、…...

【Windows 常用工具系列 20 -- MobaXterm 登录 WSL】

文章目录 MobaXterm 登录 WSL MobaXterm 登录 WSL 在 WSL 启动之后,打开 MobaXterm: 在 Distribution 中选择自己本地安装的 ubuntu 版本,我这里使用的是ubuntu-20.4,然后在 runmethod 中选择 Localhost connection. 连接成功之…...

【vmware+ubuntu16.04】ROS学习_博物馆仿真克隆ROS-Academy-for-Beginners软件包处理依赖报错问题

首先安装git 进入终端,输入sudo apt-get install git 安装后,创建一个工作空间名为tutorial_ws, 输入 mkdir tutorial_ws#创建工作空间 cd tutorial_ws#进入 mkdir src cd src git clone https://github.com/DroidAITech/ROS-Academy-for-Be…...

UniApp的Vue3版本中H5配置代理的最佳方法

UniApp的Vue3版本中H5项目在本地开发时需要配置跨域请求调试 最开始在 manifest.json中配置 总是报404,无法通过代理请求远程的接口并返回404错误。 经过验证在项目根目录创建 vite.config.js文件 vite.config.js内容: // vite.config.js import {defineConfig }…...

深入了解Pod

Pod是Kubernetes中最小的单元,它由一组、一个或多个容器组成,每个Pod还包含了一个Pause容器,Pause容器是Pod的父容器,主要负责僵尸进程的回收管理,通过Pause容器可以使同一个Pod里面的多个容器共享存储、网络、PID、IPC等。 1、Pod 是由一组紧耦合的容器组成的容器组,当然…...

基于Spider异步爬虫框架+JS动态参数逆向+隧道代理+自定义中间件的猎聘招聘数据爬取

在本篇博客中,我们将介绍如何使用 Scrapy 框架结合 JS 逆向技术、代理服务器和自定义中间件,来爬取猎聘网站的招聘数据。猎聘是一个国内知名的招聘平台,提供了大量的企业招聘信息和职位信息。本项目的目标是抓取指定城市的招聘信息&#xff0…...

Spring 中的 BeanDefinitionParserDelegate 和 NamespaceHandler

一、BeanDefinitionParserDelegate Spring在解析xml文件的时候&#xff0c;在遇到<bean>标签的时候&#xff0c;我们会使用BeanDefinitionParserDelegate对象类解析<bean>标签的内容&#xff0c;包括<bean>标签的多个属性&#xff0c;例如 id name class in…...

BERT模型核心组件详解及其实现

摘要 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是一种基于Transformer架构的预训练模型&#xff0c;在自然语言处理领域取得了显著的成果。本文详细介绍了BERT模型中的几个关键组件及其实现&#xff0c;包括激活函数、变量初始化…...

图论-代码随想录刷题记录[JAVA]

文章目录 前言深度优先搜索理论基础所有可达路径岛屿数量岛屿最大面积孤岛的总面积沉默孤岛Floyd 算法dijkstra&#xff08;朴素版&#xff09;最小生成树之primkruskal算法 前言 新手小白记录第一次刷代码随想录 1.自用 抽取精简的解题思路 方便复盘 2.代码尽量多加注释 3.记录…...

c#加载shellcode

本地加载bin文件 SharpPELoader项目如下&#xff1a; using System; using System.IO; using System.Runtime.InteropServices;namespace TestShellCode {internal class Program{private const uint MEM_COMMIT 0x1000;private const uint PAGE_EXECUTE_READWRITE 0x40;pr…...

HarmonyOS 开发环境搭建

HarmonyOS&#xff08;鸿蒙操作系统&#xff09;作为一种面向全场景多设备的智能操作系统&#xff0c;正逐渐在市场上崭露头角。为了进入HarmonyOS生态&#xff0c;开发者需要搭建一个高效的开发环境。本文将详细介绍如何搭建HarmonyOS开发环境&#xff0c;特别是如何安装和配置…...

【网络云计算】2024第46周周考-磁盘管理的基础知识-RAID篇

文章目录 1、画出各个RAID的结构图&#xff0c;6句话说明优点和缺点&#xff0c;以及磁盘可用率和坏盘数量&#xff0c;磁盘总的数量2、写出TCP五层模型以及对应的常用协议 【网络云计算】2024第46周周考-磁盘管理的基础知识-RAID篇 1、画出各个RAID的结构图&#xff0c;6句话说…...

深入理解 SQL_MODE 之 ANSI_QUOTES

引言 在 MySQL 数据库中&#xff0c;sql_mode 是一个重要的配置参数&#xff0c;它定义了 MySQL 应该遵循的 SQL 语法标准以及数据验证规则。其中&#xff0c;ANSI_QUOTES 是 sql_mode 中的一个重要选项&#xff0c;它改变了 MySQL 对于字符串和标识符的识别方式&#xff0c;使…...

容器技术在持续集成与持续交付中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 容器技术在持续集成与持续交付中的应用 容器技术在持续集成与持续交付中的应用 容器技术在持续集成与持续交付中的应用 引言 容器…...

【嵌入式软件-STM32】OLED显示屏+调试方法

目录 一、调试方式 1&#xff09;串口调试 优势 弊端 2&#xff09;显示屏调试 优势 弊端 3&#xff09;Keil调试模式 4&#xff09;点灯调试法 5&#xff09;注释调试法 6&#xff09;对照法 二、OLED简介 OLED组件 OLED显示屏 0.96寸OLED模块 OLED外观和种类…...

kubernetes简单入门实战

本章将介绍如何在kubernetes集群中部署一个nginx服务&#xff0c;并且能够对其访问 Namespace Namespace是k8s系统中一个非常重要的资源&#xff0c;它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。 默认情况下&#xff0c;k8s集群中的所有的Pod都是可以相…...

Claude Code 可观测性工程爆火全解析:AI Agent 日志、遥测、追踪、成本监控与安全治理一次讲透

导语&#xff1a;AI Agent 真正进入生产环境后&#xff0c;最重要的问题不再是“能不能跑”&#xff0c;而是“跑得怎么样、哪里慢、哪里错、成本多少、有没有泄露、能不能恢复”。可观测性工程&#xff0c;就是把这些问题变成可度量、可告警、可追踪、可治理的系统能力。一图看…...

体验Taotoken分钟级接入与标准OpenAI协议的无缝切换

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 体验Taotoken分钟级接入与标准OpenAI协议的无缝切换 对于已经熟悉OpenAI API的开发者而言&#xff0c;尝试新的模型服务通常意味着…...

Perplexity估值从3B美元缩水至1.8B?华尔街分析师闭门会议纪要首度流出(含5条未公开预警红线)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Perplexity估值缩水事件全景速览 2024年第三季度&#xff0c;AI搜索初创公司Perplexity在完成新一轮融资后&#xff0c;其内部估值从2023年底的10亿美元迅速回调至约7.5亿美元&#xff0c;引发全球科技…...

别再让烙铁头‘烧死’了!手把手教你电烙铁日常保养与复活术(附温度设置建议)

电烙铁头养护全攻略&#xff1a;从氧化原理到实战修复技巧 1. 烙铁头氧化背后的科学原理 烙铁头氧化并非单纯由高温引起&#xff0c;而是高温与氧气共同作用的结果。当烙铁头暴露在空气中时&#xff0c;高温会加速金属表面与氧气的化学反应&#xff0c;形成一层致密的氧化层。这…...

食品制造 | 品控AI自动化方案主流厂商横评:2026企业级智能体选型与落地实测

2026年&#xff0c;全球食品制造业正处于从“数字化转型”向“智能化深耕”跨越的关键节点。随着国家市场监管总局“互联网AI监管”战略的全面深化&#xff0c;食品安全已不再仅仅依赖于周期性的线下抽检&#xff0c;而是转向了基于AI技术的全时段、全链路实时监控。 从校园食堂…...

别再只会用HAL库了!手把手教你用寄存器操作STM32的SysTick定时器(附精准延时函数)

深入STM32 SysTick定时器&#xff1a;寄存器级精准延时实战指南 从库函数到寄存器&#xff1a;为什么需要更底层的控制&#xff1f; 在嵌入式开发领域&#xff0c;时间控制精度往往决定着系统性能的上限。许多开发者习惯使用HAL库或标准库提供的延时函数&#xff0c;却很少思考…...

终极网盘直链下载助手完整使用指南:如何高效获取八大网盘文件直链

终极网盘直链下载助手完整使用指南&#xff1a;如何高效获取八大网盘文件直链 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动…...

NewJob智能识别插件:求职时间管理的终极解决方案

NewJob智能识别插件&#xff1a;求职时间管理的终极解决方案 【免费下载链接】NewJob 一眼看出该职位最后修改时间&#xff0c;绿色为2周之内&#xff0c;暗橙色为1.5个月之内&#xff0c;红色为1.5个月以上 项目地址: https://gitcode.com/GitHub_Trending/ne/NewJob 在…...

终极Python GUI设计器:Pygubu Designer完全指南

终极Python GUI设计器&#xff1a;Pygubu Designer完全指南 【免费下载链接】pygubu-designer A simple GUI designer for the python tkinter module 项目地址: https://gitcode.com/gh_mirrors/py/pygubu-designer 还在为Python GUI开发而烦恼吗&#xff1f;厌倦了手写…...

任天堂Switch游戏备份终极指南:nxdumptool完全解析

任天堂Switch游戏备份终极指南&#xff1a;nxdumptool完全解析 【免费下载链接】nxdumptool Generates XCI/NSP/HFS0/ExeFS/RomFS/Certificate/Ticket dumps from Nintendo Switch gamecards and installed SD/eMMC titles. 项目地址: https://gitcode.com/gh_mirrors/nx/nxd…...