JS详解-设计模式

news2025/1/21 0:56:13

工厂模式:

单例模式:

// 1、定义一个类
        class SingleTon{
            // 2、添加私有静态属性
            static #instance
            // 3、添加静态方法
            static getInstance(){
                // 4、判断实例是否存在
                if(!this.#instance){
                    // 5、实例不存在,创建实例
                    this.#instance = new SingleTon();
                }
                // 6、返回实例
                return SingleTon.#instance;
            }
        }
        // 测试代码
        const s1 = SingleTon.getInstance();
        const s2 = SingleTon.getInstance();
        console.log(s1 === s2); // true

观察者模式:

发布订阅模式:

$on

$emit

        

$off

$once

源码集合:
<h2>发布订阅模式</h2>
    <button class="on">注册事件</button>
    <button class="emit">触发事件</button>
    <button class="off">移除事件</button>
    <button class="once-on">一次性事件注册</button>
    <button class="once-emit">一次性事件触发</button>
    <script>
        class MyEmmiter {
            // 添加私有属性
            #handlers = {
                // 事件名称:[事件处理函数1,事件处理函数2]
            }
            // 添加事件监听
            $on(event,callback){
                // 1.2保存事件
                if(this.#handlers[event] === undefined){
                    this.#handlers[event] = [];
                }
                this.#handlers[event].push(callback);
            }
            // 触发事件
            // 接收不定长参数
            $emit(event,...args){
                // 循环触发事件
                const funcs = this.#handlers[event] || []
                funcs.forEach(callback=>callback(...args))
            }
            // 移除事件
            $off(event){
                // 清空事件
                this.#handlers[event] = undefined
            }
            // 一次性事件注册
            $once(event,callback){
                // 注册$on事件
                this.$on(event,(...args)=>{
                    callback(...args)
                    // 事件内部移除
                    this.$off(event)
                } )
            }
        }
            // 实例化
            const bus = new MyEmmiter();

            // 注册事件
            document.querySelector('.on').addEventListener('click',()=>{
                bus.$on('event1',()=>{console.log('回调函数')})
                bus.$on('event2',(name,info)=>{console.log(name,info)})
                bus.$on('event2',(name,info)=>{console.log('event 第二个回调函数',name,info)})
            })
            // 触发事件
            document.querySelector('.emit').addEventListener('click',()=>{
                bus.$emit('event1')
                bus.$emit('event2','ian','18')
            })
            // 移除事件
            document.querySelector('.off').addEventListener('click',()=>{
                // 移除事件1
             bus.$off('event1')
            })
            // 一次性事件注册
            document.querySelector('.once-on').addEventListener('click',()=>{
                bus.$once('event3',(name,info)=>{console.log('一次性事件',name,info)})
            })
            // 一次性事件触发
            document.querySelector('.once-emit').addEventListener('click',()=>{
                bus.$emit('event3','ian','18')
            })


原型模式:

代理模式:

如图所示,使用缓存代理,只需要调用一次接口获取到数据,之后的接口数据都可以直接从缓存中获取,减小服务器压力

迭代器模式:

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

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

相关文章

Redis从入门到精通(七)Redis实战(四)库存超卖、一人一单与Redis分布式锁

↑↑↑请在文章开头处下载测试项目源代码↑↑↑ 文章目录 前言4.3 优惠券秒杀4.3.4 库存超卖问题及其解决4.3.4.1 问题分析4.3.4.2 问题解决 4.3.5 一人一单需求4.3.5.1 需求分析4.3.5.2 代码实现4.3.5.3 并发问题4.3.5.4 悲观锁解决并发问题4.3.5.5 集群环境下的并发问题 4.3.…

C语言【编译和链接】

1.程序执行过程 C语言的编译和链接是将源代码转换为可执行程序的过程。下面是C语言编译和链接的基本步骤&#xff1a; 预处理&#xff1a;在编译前&#xff0c;预处理器会对源代码进行。它会处理以"#"开头的预处理指令&#xff0c;#include和#define&#xff0c;并将…

【浅尝C++】继承机制=>虚基表/菱形虚继承/继承的概念、定义/基类与派生类对象赋值转换/派生类的默认成员函数等详解

&#x1f3e0;专栏介绍&#xff1a;浅尝C专栏是用于记录C语法基础、STL及内存剖析等。 &#x1f3af;每日格言&#xff1a;每日努力一点点&#xff0c;技术变化看得见。 文章目录 继承的概念及定义继承的概念继承的定义定义格式继承关系与访问限定符 基类和派生类对象赋值转换继…

CSS样式计算

目录 用户代理样式表确认声明值层叠冲突重要性权重源次序 继承使用默认值关于a元素不能继承的问题 在网页中&#xff0c;每个 元素都有着许多 CSS属性&#xff0c;有些 属性我们对其 声明并赋值&#xff0c;有些 属性则没有&#xff0c;我们可能会想当然的以为一个 元素会…

如果在 Ubuntu 系统中两个设备出现两个相同的端口号解决方案

问题描述&#xff1a; 自己的移动机器人在为激光雷达和IMU配置动态指定的端口时&#xff0c;发现激光雷达和深度相机配置的 idVendor 和 idProduct 相同&#xff0c;但是两个设备都具有不同的ttyUSB号&#xff0c;如下图所示 idVendor&#xff1a;代表着设备的生产商ID,由USB设…

Vuex(vue 项目中实现 频繁、大范围数据共享的技术方案)

参考文档(点击查看) 好处 1.数据的存取一步到位&#xff0c;不需层层传递 2.数据的流动非常清晰 3.存储在Vuex中的数据都是响应式的&#xff08;数据更新后&#xff0c;使用数据的组件都会自动更新&#xff09; Vuex基础配置 npm i vuex3.6.2state中用来存储数据&#xff0c…

如何客观评价5G的现状?

前几天&#xff0c;在知乎上看到一个帖子&#xff0c;热度挺高&#xff1a; 看了一下帖子的回答&#xff0c;基本上都在骂5G。 作为通信行业从业者&#xff0c;我说说我自己的看法。大家姑且听听&#xff0c;一起交流一下。 我们目前所处的这个时代&#xff0c;有一个很大的特点…

移动Web学习05-移动端适配Less预处理器

7、移动端适配 7.1、什么是适配&#xff1f; 简单理解就是、同一个网页&#xff0c;在不同屏幕分辨率的设备下、显示还是一样的&#xff0c;你可以理解为、网页当中的图片&#xff0c;盒子之间的距离、文字的大小、随着屏幕分辨率的变化而变化 前面我们学习了flex布局的方式…

Web大并发集群部署之集群介绍

一、传统web访问模型 传统web访问模型完成一次请求的步骤 1&#xff09;用户发起请求 2&#xff09;服务器接受请求 3&#xff09;服务器处理请求&#xff08;压力最大&#xff09; 4&#xff09;服务器响应请求 传统模型缺点 单点故障&#xff1b; 单台服务器资源有限&…

excel统计分析——多元线性回归

参考资料&#xff1a;生物统计学 多元线性回归&#xff08;multiple linear regression&#xff09;是具有一个因变量或多个&#xff08;两个或以上&#xff09;自变量的线性回归&#xff0c;是直线回归的拓展&#xff0c;其模型和计算过程与直线回归类似&#xff0c;只是在计算…

【软件工程】测试规格

1. 引言 1.1简介 本次的测试用例是基于核心代码基本开发完毕&#xff0c;在第一代系统基本正常运行后编写的&#xff0c;主要目的是为了后续开发与维护的便利性。 该文档主要受众为该系统后续开发人员&#xff0c;并且在阅读此文档前最后先阅读本系统的需求文档、概要设计文…

Qt事件学习案例

视频链接 https://www.bilibili.com/video/BV18B4y1K7Cs?p7&spm_id_frompageDriver&vd_sourcefa4ef8f26ae084f9b5f70a5f87e9e41bQt5跟着视频做即可&#xff0c;Qt6部分代码需要改动,改动的地方注释有写 素材 百度云 链接&#xff1a;https://pan.baidu.com/s/158j…

K8S - Deployment 的版本回滚

当前状态 先看deployment rootk8s-master:~# kubectl get deploy -o wide --show-labels NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES …

蓝桥杯嵌入式(G431)备赛笔记——LED

cubeMX配置: 原理图,其中PD2高电平使能锁存器,PC8-15默认给高电平,放置上电初始化LED亮 74HC573是八路输出锁存器 1脚是使能,低电平有效,高电平输出高阻 2~9是输入,PC8-PC15 19~12是输出 11是锁存,即PD2: 高电平是同步,即输出跟随输入变化 低电平锁存,即输出不再改变 …

RUST Rover 条件编译 异常处理

按官方处理发现异常 会报异常 error: failed to parse manifest at C:\Users\topma\RustroverProjects\untitled2\Cargo.toml 修改模式如下才能正常编译 网上说明 这样处理 https://course.rs/cargo/reference/features/intro.html RUST 圣经里描述 [features] print-a []…

如何用putty通过ssh连接ubuntu

1. 下载和安装PuTTY 访问PuTTY官网下载PuTTY的最新版本。 2. 打开PuTTY 解压下载的文件后&#xff0c;找到PuTTY文件并双击打开。 3. 配置SSH连接 在ubuntu下安装ssh服务在安装ssh时&#xff0c;我一直遇到一个问题&#xff0c;原因是我的虚拟机连不上网&#xff0c;反复实…

Linux之shell脚本编辑工具awk

华子目录 概念工作流程工作图流程&#xff08;按行处理&#xff09; awk程序执行方式1.通过命令行执行awk程序实例 2.awk命令调用脚本执行实例 3.直接使用awk脚本文件调用实例 awk命令的基本语法格式BEGIN模式与END模式实例awk的输出 记录和域&#xff08;记录表示数据行&#…

若依:一个基于Spring Boot、Spring Security、JWT、Vue和Element的全部开源快速开发平台

若依后台管理系统&#xff1a;一个基于Spring Boot、Spring Security、JWT、Vue和Element的全部开源快速开发平台 一、引言 随着软件开发技术的发展&#xff0c;前后端分离的开发模式逐渐成为主流。这种模式能够提高开发效率&#xff0c;降低维护成本&#xff0c;使前后端工程…

SketchUp Pro 2024 for mac 草图大师 专业的3D建模软件

SketchUp Pro 2024 for Mac是一款功能强大的三维建模软件&#xff0c;适用于Mac电脑。其简洁易用的界面和强大的工具集使得用户可以轻松创建复杂的3D模型。 软件下载&#xff1a;SketchUp Pro 2024 for mac v24.0.483 激活版下载 SketchUp Pro 2024 for Mac支持导入和导出多种文…

leetcode.面试题 02.07. 链表相交

题目 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 思路 假a在链表A上移动,b在链表B上移动&#xff0c;a移动完在B上开始&…