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

JavaScript系列(45)--响应式编程实现详解

JavaScript响应式编程实现详解 🔄

今天,让我们深入探讨JavaScript的响应式编程实现。响应式编程是一种基于数据流和变化传播的编程范式,它使我们能够以声明式的方式处理异步数据流。

响应式编程基础概念 🌟

💡 小知识:响应式编程的核心是将所有事物都视为数据流,包括变量、用户输入、网络请求等。通过对这些数据流进行组合和转换,我们可以以声明式的方式处理复杂的异步操作。

基本实现 📊

// 1. 基础Observable实现
class Observable {constructor(subscribe) {this.subscribe = subscribe;}// 静态创建方法static from(value) {return new Observable(observer => {if (Array.isArray(value)) {value.forEach(item => observer.next(item));observer.complete();} else {observer.next(value);observer.complete();}return () => {}; // 清理函数});}static fromEvent(target, eventName) {return new Observable(observer => {const handler = event => observer.next(event);target.addEventListener(eventName, handler);return () => target.removeEventListener(eventName, handler);});}// 转换操作符map(fn) {return new Observable(observer => {return this.subscribe({next: value => observer.next(fn(value)),error: err => observer.error(err),complete: () => observer.complete()});});}filter(predicate) {return new Observable(observer => {return this.subscribe({next: value => {if (predicate(value)) {observer.next(value);}},error: err => observer.error(err),complete: () => observer.complete()});});}
}// 2. Subject实现
class Subject extends Observable {constructor() {super();this.observers = new Set();}next(value) {this.observers.forEach(observer => observer.next(value));}error(error) {this.observers.forEach(observer => observer.error(error));}complete() {this.observers.forEach(observer => observer.complete());}subscribe(observer) {this.observers.add(observer);return {unsubscribe: () => {this.observers.delete(observer);}};}
}// 3. BehaviorSubject实现
class BehaviorSubject extends Subject {constructor(initialValue) {super();this._value = initialValue;}get value() {return this._value;}next(value) {this._value = value;super.next(value);}subscribe(observer) {observer.next(this._value);return super.subscribe(observer);}
}

高级操作符实现 🚀

// 1. 组合操作符
class OperatorFactory {// 合并多个Observablestatic merge(...observables) {return new Observable(observer => {const subscriptions = observables.map(obs =>obs.subscribe({next: value => observer.next(value),error: err => observer.error(err)}));return () => {subscriptions.forEach(sub => sub.unsubscribe());};});}// 连接多个Observablestatic concat(...observables) {return new Observable(observer => {let currentIndex = 0;let currentSubscription = null;function subscribeNext() {if (currentIndex >= observables.length) {observer.complete();return;}currentSubscription = observables[currentIndex].subscribe({next: value => observer.next(value),error: err => observer.error(err),complete: () => {currentIndex++;subscribeNext();}});}subscribeNext();return () => {if (currentSubscription) {currentSubscription.unsubscribe();}};});}// 组合最新值static combineLatest(...observables) {return new Observable(observer => {const values = new Array(observables.length);const hasValue = new Array(observables.length).fill(false);const subscriptions = observables.map((obs, index) =>obs.subscribe({next: value => {values[index] = value;hasValue[index] = true;if (hasValue.every(Boolean)) {observer.next([...values]);}},error: err => observer.error(err)}));return () => {subscriptions.forEach(sub => sub.unsubscribe());};});}
}// 2. 时间操作符
class TimeOperators {// 延迟发送static delay(time) {return observable => new Observable(observer => {return observable.subscribe({next: value => {setTimeout(() => observer.next(value), time);},error: err => observer.error(err),complete: () => observer.complete()});});}// 节流static throttleTime(time) {return observable => new Observable(observer => {let lastTime = 0;return observable.subscribe({next: value => {const now = Date.now();if (now - lastTime >= time) {lastTime = now;observer.next(value);}},error: err => observer.error(err),complete: () => observer.complete()});});}// 防抖static debounceTime(time) {return observable => new Observable(observer => {let timeoutId = null;return observable.subscribe({next: value => {if (timeoutId !== null) {clearTimeout(timeoutId);}timeoutId = setTimeout(() => {observer.next(value);timeoutId = null;}, time);},error: err => observer.error(err),complete: () => observer.complete()});});}
}// 3. 错误处理操作符
class ErrorOperators {// 重试static retry(count) {return observable => new Observable(observer => {let retries = 0;let subscription = null;function subscribe() {subscription = observable.subscribe({next: value => observer.next(value),error: err => {if (retries < count) {retries++;subscribe();} else {observer.error(err);}},complete: () => observer.complete()});}subscribe();return () => {if (subscription) {subscription.unsubscribe();}};});}// 错误恢复static catchError(selector) {return observable => new Observable(observer => {return observable.subscribe({next: value => observer.next(value),error: err => {try {const result = selector(err);result.subscribe(observer);} catch (e) {observer.error(e);}},complete: () => observer.complete()});});}
}

实际应用场景 💼

// 1. 表单验证
class ReactiveForm {constructor() {this.formData = new BehaviorSubject({});this.errors = new BehaviorSubject({});}// 设置表单值setValue(field, value) {const currentData = this.formData.value;this.formData.next({...currentData,[field]: value});this.validate(field, value);}// 添加验证规则addValidation(field, rules) {const formStream = this.formData.pipe(map(data => data[field]),filter(value => value !== undefined));formStream.subscribe(value => {const fieldErrors = [];rules.forEach(rule => {const error = rule(value);if (error) {fieldErrors.push(error);}});const currentErrors = this.errors.value;this.errors.next({...currentErrors,[field]: fieldErrors});});}
}// 2. 实时搜索
class ReactiveSearch {constructor(inputElement) {this.searchInput = Observable.fromEvent(inputElement, 'input').pipe(map(event => event.target.value),debounceTime(300),filter(text => text.length >= 2));}onSearch(callback) {return this.searchInput.subscribe({next: async text => {try {const results = await this.performSearch(text);callback(null, results);} catch (error) {callback(error);}}});}async performSearch(text) {// 实现搜索逻辑}
}// 3. WebSocket实时数据
class ReactiveWebSocket {constructor(url) {this.messages = new Subject();this.ws = new WebSocket(url);this.ws.onmessage = event => {this.messages.next(JSON.parse(event.data));};this.ws.onerror = error => {this.messages.error(error);};this.ws.onclose = () => {this.messages.complete();};}send(data) {this.ws.send(JSON.stringify(data));}close() {this.ws.close();}
}

性能优化技巧 ⚡

// 1. 共享订阅
class ShareOperator {static share() {return observable => {const subject = new Subject();let refCount = 0;let subscription = null;return new Observable(observer => {refCount++;if (!subscription) {subscription = observable.subscribe(subject);}const sub = subject.subscribe(observer);return () => {refCount--;sub.unsubscribe();if (refCount === 0 && subscription) {subscription.unsubscribe();subscription = null;}};});};}
}// 2. 缓存优化
class CacheOperator {static cache(maxSize = 100) {return observable => {const cache = new Map();return new Observable(observer => {return observable.subscribe({next: value => {if (cache.size >= maxSize) {const firstKey = cache.keys().next().value;cache.delete(firstKey);}cache.set(Date.now(), value);observer.next(value);},error: err => observer.error(err),complete: () => observer.complete()});});};}
}// 3. 批处理优化
class BatchOperator {static bufferCount(count) {return observable => new Observable(observer => {let buffer = [];return observable.subscribe({next: value => {buffer.push(value);if (buffer.length >= count) {observer.next(buffer);buffer = [];}},error: err => observer.error(err),complete: () => {if (buffer.length > 0) {observer.next(buffer);}observer.complete();}});});}
}

最佳实践建议 💡

  1. 响应式设计模式
// 1. 观察者模式
class ObserverPattern {// 创建可观察的状态static createObservableState(initialState) {return new BehaviorSubject(initialState);}// 创建派生状态static createDerivedState(source, transform) {return source.pipe(map(transform),distinctUntilChanged());}
}// 2. 响应式状态管理
class ReactiveStore {constructor(initialState = {}) {this.state = new BehaviorSubject(initialState);this.actions = new Subject();this.actions.subscribe(action => {const currentState = this.state.value;const newState = this.reducer(currentState, action);this.state.next(newState);});}dispatch(action) {this.actions.next(action);}select(selector) {return this.state.pipe(map(selector),distinctUntilChanged());}
}// 3. 响应式数据绑定
class ReactiveBinding {static bindInput(input, subject) {const subscription = Observable.fromEvent(input, 'input').pipe(map(event => event.target.value)).subscribe(value => subject.next(value));subject.subscribe(value => {input.value = value;});return subscription;}
}

结语 📝

响应式编程为处理异步数据流提供了强大而优雅的解决方案。通过本文,我们学习了:

  1. 响应式编程的基本概念和实现
  2. 高级操作符的实现原理
  3. 实际应用场景和示例
  4. 性能优化技巧
  5. 最佳实践和设计模式

💡 学习建议:在使用响应式编程时,要注意内存管理和取消订阅。合理使用操作符组合,避免过度复杂的数据流。同时,要考虑错误处理和边界情况。


如果你觉得这篇文章有帮助,欢迎点赞收藏,也期待在评论区看到你的想法和建议!👇

终身学习,共同成长。

咱们下一期见

💻

相关文章:

JavaScript系列(45)--响应式编程实现详解

JavaScript响应式编程实现详解 &#x1f504; 今天&#xff0c;让我们深入探讨JavaScript的响应式编程实现。响应式编程是一种基于数据流和变化传播的编程范式&#xff0c;它使我们能够以声明式的方式处理异步数据流。 响应式编程基础概念 &#x1f31f; &#x1f4a1; 小知识…...

uniapp版本升级

1.样式 登录进到首页&#xff0c;弹出更新提示框&#xff0c;且不可以关闭&#xff0c;侧边返回直接退出&#xff01; 有关代码&#xff1a; <uv-popup ref"popupUpdate" round"8" :close-on-click-overlay"false"><view style"…...

K8s运维管理平台 - KubeSphere 3.x 和4.x 使用分析:功能较强,UI美观

目录标题 Lic使用感受优点&#xff1a;优化点&#xff1a; 实操首页项目 | 应用负载 | 配置 | 定制资源定义存储监控告警集群设置 **KubeSphere 3.x** 和 **4.x**1. **架构变化**&#xff1a;2. **多集群管理**&#xff1a;3. **增强的 DevOps 功能**&#xff1a;4. **监控与日…...

使用Python Dotenv库管理环境变量

使用Python Dotenv库管理环境变量 在开发Python应用程序时&#xff0c;管理配置信息&#xff08;如API密钥、数据库连接字符串等&#xff09;是一个常见的需求。为了确保安全性和灵活性&#xff0c;通常不建议将这些敏感信息硬编码在代码中。这时&#xff0c;dotenv库就派上了…...

HTTP 配置与应用(不同网段)

想做一个自己学习的有关的csdn账号&#xff0c;努力奋斗......会更新我计算机网络实验课程的所有内容&#xff0c;还有其他的学习知识^_^&#xff0c;为自己巩固一下所学知识&#xff0c;下次更新校园网设计。 我是一个萌新小白&#xff0c;有误地方请大家指正&#xff0c;谢谢…...

异或哈希总结

例题 例题1https://codeforces.com/problemset/problem/1175/Fhttps://codeforces.com/problemset/problem/1175/F 例题2https://codeforces.com/contest/2014/problem/Hhttps://codeforces.com/contest/2014/problem/H例题4https://codeforces.com/contest/1418/problem/Ght…...

我的2024年总结

趁着摸鱼赶紧写一下吧 去年目标review 还是将去年的目标完成了一些 【接纳不完美&#xff0c;多拍照片】 这个还是部分做到了&#xff0c;今年和一些朋友们见面时都注意拍照留记录了&#xff0c;不过还可以继续加强&#xff0c;因为外貌上发生了重大变化&#xff0c;下面细说…...

简易CPU设计入门:控制总线的剩余信号(二)

项目代码下载 请大家首先准备好本项目所用的源代码。如果已经下载了&#xff0c;那就不用重复下载了。如果还没有下载&#xff0c;那么&#xff0c;请大家点击下方链接&#xff0c;来了解下载本项目的CPU源代码的方法。 CSDN文章&#xff1a;下载本项目代码 上述链接为本项目…...

软件开发中的密码学(国密算法)

1.软件行业中的加解密 在软件行业中&#xff0c;加解密技术广泛应用于数据保护、通信安全、身份验证等多个领域。加密&#xff08;Encryption&#xff09;是将明文数据转换为密文的过程&#xff0c;而解密&#xff08;Decryption&#xff09;则是将密文恢复为明文的过程。以下…...

ArcGIS10.2 许可License点击始终启动无响应的解决办法及正常启动的前提

1、问题描述 在ArcGIS License Administrator中&#xff0c;手动点击“启动”无响应&#xff1b;且在计算机管理-服务中&#xff0c;无ArcGIS License 或者License的启动、停止、禁止等均为灰色&#xff0c;无法操作。 2、解决方法 ①通过cmd对service.txt进行手动服务的启动…...

rust feature h和 workspace相关知识 (十一)

feature 相关作用和描述 在 Rust 中&#xff0c;features&#xff08;特性&#xff09; 是一种控制可选功能和依赖的机制。它允许你在编译时根据不同的需求启用或禁用某些功能&#xff0c;优化构建&#xff0c;甚至改变代码的行为。Rust 的特性使得你可以轻松地为库提供不同的…...

动手学深度学习-卷积神经网络-3填充和步幅

目录 填充 步幅 小结 在上一节的例子&#xff08;下图&#xff09; 中&#xff0c;输入的高度和宽度都为3&#xff0c;卷积核的高度和宽度都为2&#xff0c;生成的输出表征的维数为22。 正如我们在 上一节中所概括的那样&#xff0c;假设输入形状为nhnw&#xff0c;卷积核形…...

最长递增——蓝桥杯

1.题目描述 在数列 a1​,a2​,⋯,an​ 中&#xff0c;如果ai​<ai1​<ai2​<⋯<aj​&#xff0c;则称 ai​ 至 aj​ 为一段递增序列&#xff0c;长度为 j−i1。 定一个数列&#xff0c;请问数列中最长的递增序列有多长。 输入描述 输入的第一行包含一个整数 n。…...

DeepSeek R1 对比 AlphaGo,Zero 的思考过程

作者&#xff1a;真中合欢 原文&#xff1a;https://zhuanlan.zhihu.com/p/19897045280 等了好久&#xff0c;终于等来R1的论文&#xff0c;我在当天晚上第一时间拜读。整篇论文的实验和理论给我一种简洁的优雅&#xff0c;和DeepSeek-V3那篇论文的感觉完全不同。读论文的过程中…...

【2025最新计算机毕业设计】基于SSM房屋租赁平台【提供源码+答辩PPT+文档+项目部署】(高质量源码,可定制,提供文档,免费部署到本地)

作者简介&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容&#xff1a;&#x1f31f;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…...

蓝桥杯练习日常|c/c++竞赛常用库函数(下)

书接上回......蓝桥杯算法日常|c\c常用竞赛函数总结备用-CSDN博客 目录 书接上回......https://blog.csdn.net/weixin_47011416/article/details/145290017 1、二分查找 2、lower_bound uper_bound 3、memset&#xff08;&#xff09; 函数原型 参数说明 返回值 常见用…...

手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion(代码)

手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion&#xff08;代码&#xff09; 目录 手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion&#xff08;代码&#xff09;Stable Diffusion 原理图Stable Diffusion的原理解释Stable Diffusion 和Di…...

技术总结:FPGA基于GTX+RIFFA架构实现多功能SDI视频转PCIE采集卡设计方案

目录 1、前言工程概述免责声明 3、详细设计方案设计框图SDI 输入设备Gv8601a 均衡器GTX 解串与串化SMPTE SD/HD/3G SDI IP核BT1120转RGBFDMA图像缓存RIFFA用户数据控制RIFFA架构详解Xilinx 7 Series Integrated Block for PCI ExpressRIFFA驱动及其安装QT上位机HDMI输出RGB转BT…...

【16届蓝桥杯寒假刷题营】第2期DAY5

2.最大公因数 - 蓝桥云课 问题描述 给你2个正整数N&#xff0c;M。 你需要构造一个有N个数的正整数序列a&#xff0c;满足以下条件&#xff1a; ∑i1N​ai​M。 求gcd(a)&#xff0c;可能的最大值。 输入描述 输入一行两个正整数N&#xff0c;M&#xff0c;表示数组的长…...

26.项目集风险管理战略和项目集风险管理活动有何区别与联系?

项目集风险管理战略和项目集风险管理活动有何区别与联系? 项目集风险管理战略和项目集风险管理活动在项目集管理中的作用不同&#xff0c;但又是密切相关的。 区别&#xff1a; 1.定义 项目集风险管理战略&#xff1a;指的是制定一套全面的、系统的方针和方法&#xff0c;…...

PETSc源码分析: Time Integrators

本文结合PETSc源代码&#xff0c;总结PETSc中的ODE/DAE求解器。 注1&#xff1a;限于研究水平&#xff0c;分析难免不当&#xff0c;欢迎批评指正。 注2&#xff1a;文章内容会不定期更新。 参考文献 Balay S. PETSc/TAO Users Manual, Revision 3.22. Argonne National Labo…...

Spring Boot是什么及其优点

简介 Spring Boot是基于Spring框架开发的全新框架&#xff0c;其设计目的是简化Spring应用的初始化搭建和开发过程。 Spring Boot整合了许多框架和第三方库配置&#xff0c;几乎可以达到“开箱即用”。 优点 可快速构建独立的Spring应用。 直接嵌入Tomcat、Jetty和Underto…...

21.Word:小赵-毕业论文排版❗【39】

目录 题目​ NO1.2 NO3.4 NO5.6 NO7.8.9 NO10.11.12 题目 NO1.2 自己的论文当中接收老师的修改&#xff1a;审阅→比较→源文档&#xff1a;考生文件夹&#xff1a;Word.docx→修订的文档&#xff1a;考生文件夹&#xff1a;教师修改→确定→接收→接收所有修订将合并之…...

LeetCode --- 433周赛

题目列表 3427. 变长子数组求和 3428. 最多 K 个元素的子序列的最值之和 3429. 粉刷房子 IV 3430. 最多 K 个元素的子数组的最值之和 一、变长子数组求和 题意要求我们能快速算出 n u m s [ s t a r t . . . i ] nums[start...i] nums[start...i] 这段区间和&#xff0c;其中…...

LLM幻觉(Hallucination)缓解技术综述与展望

LLMs 中的幻觉问题&#xff08;LLM 幻觉&#xff1a;现象剖析、影响与应对策略&#xff09;对其可靠性与实用性构成了严重威胁。幻觉现象表现为模型生成的内容与事实严重不符&#xff0c;在医疗、金融、法律等对准确性要求极高的关键领域&#xff0c;可能引发误导性后果&#x…...

Rocky9.5编译freeswitch【记录】

文件目录 tree -dL 1 . ├── flite-2.0.0 ├── freeswitch ├── ldns-1.8.4 ├── libcodec2-2.59 ├── libks ├── ooh323-0.1 ├── opus ├── signalwire-client-c ├── sofia-sip ├── spandsp ├── v8-6.1.298 └── zeromq-2.1.9操作记录 ip a nm…...

自定义数据集 使用tensorflow框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测

在 TensorFlow 中实现逻辑回归、保存模型并加载模型进行预测的过程可以分为以下几个步骤&#xff1a; 准备数据&#xff1a;创建或加载你的自定义数据集。构建逻辑回归模型。训练模型。保存模型。加载模型。使用加载的模型进行预测。 import tensorflow as tf import numpy as…...

WPF进阶 | WPF 数据绑定进阶:绑定模式、转换器与验证

WPF进阶 | WPF 数据绑定进阶&#xff1a;绑定模式、转换器与验证 一、前言二、WPF 数据绑定基础回顾2.1 数据绑定的基本概念2.2 数据绑定的基本语法 三、绑定模式3.1 单向绑定&#xff08;One - Way Binding&#xff09;3.2 双向绑定&#xff08;Two - Way Binding&#xff09;…...

八股——Java基础(四)

目录 一、泛型 1. Java中的泛型是什么 ? 2. 使用泛型的好处是什么? 3. Java泛型的原理是什么 ? 什么是类型擦除 ? 4.什么是泛型中的限定通配符和非限定通配符 ? 5. List和List 之间有什么区别 ? 6. 可以把List传递给一个接受List参数的方法吗&#xff1f; 7. Arra…...

2025蓝桥杯JAVA编程题练习Day1

1.刑侦科推理试题 题目描述 有以下10道单选题&#xff0c;编程求这10道题的答案。 这道题的答案是&#xff1a; A. A B. B C. C D. D 第5题的答案是&#xff1a; A. C B. D C. A D. B 以下选项中哪一题的答案与其他三项不同&#xff1a; A. 第3题 B. 第6题 C. 第2题 D.…...

数据结构与算法-要点整理

知识导图: 一、数据结构 包含:线性表(数组、队列、链表、栈)、散列表、树(二叉树、多路查找树)、图 1.线性表 数据之间就是“一对一“的逻辑关系。 线性表存储数据的实现方案有两种,分别是顺序存储结构和链式存储结构。 包含:数组、队列、链表、栈。 1.1 数组…...

SaaS底层盈利逻辑剖析:运维费与服务费的战略抉择

一、引言 1.1 研究背景与意义 在数字化浪潮的推动下&#xff0c;SaaS&#xff08;软件即服务&#xff09;行业近年来取得了迅猛发展&#xff0c;成为软件产业中不可或缺的一部分。SaaS 通过互联网提供软件服务&#xff0c;企业无需进行复杂的本地软件安装和硬件购置&#xff…...

Python爬虫之——Cookie存储器

目录 专栏导读1、背景介绍2、库的安装3、核心代码4、完整代码总结 专栏导读 &#x1f338; 欢迎来到Python办公自动化专栏—Python处理办公问题&#xff0c;解放您的双手 &#x1f3f3;️‍&#x1f308; 博客主页&#xff1a;请点击——> 一晌小贪欢的博客主页求关注 &…...

【数据结构】(2)时间、空间复杂度

一、衡量算法好坏的指标 时间复杂度衡量算法的运行速度&#xff0c;空间复杂度衡量算法所需的额外空间。这些指标&#xff0c;是某场景中选择使用哪种数据结构和算法的依据。如今&#xff0c;计算机的存储器已经变得容易获得&#xff0c;所以不再太关注空间复杂度。 二、渐进表…...

理解 IS-IS 中重要概念之间的关系

本文为 “IS-IS 中重要概念” 相关文章合辑。 未整理去重。 理解 IS-IS、CLNS、CMNS、NSAP、NET 等概念之间的关系 1. 核心概念 IS-IS (Intermediate System to Intermediate System) 一种链路状态路由协议&#xff0c;基于 SPF&#xff08;最短路径优先&#xff09;算法计…...

AI 模型评估与质量控制:生成内容的评估与问题防护

在生成式 AI 应用中&#xff0c;模型生成的内容质量直接影响用户体验。然而&#xff0c;生成式模型存在一定风险&#xff0c;如幻觉&#xff08;Hallucination&#xff09;问题——生成不准确或完全虚构的内容。因此&#xff0c;在构建生成式 AI 应用时&#xff0c;模型评估与质…...

Mybatis-plus缓存

mybatis-plus缓存 MyBatis-Plus 是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上提供了更多的便利性和强大的功能&#xff0c;包括但不限于分页、条件构造器、通用 Mapper、代码生成器等。MyBatis-Plus 也内置了基础的缓存功能&#xff0c;但需要注意的是&#xff…...

unity学习20:time相关基础 Time.time 和 Time.deltaTime

目录 1 unity里的几种基本时间 1.1 time 相关测试脚本 1.2 游戏开始到现在所用的时间 Time.time 1.3 时间缩放值 Time.timeScale 1.4 固定时间间隔 Time.fixedDeltaTime 1.5 两次响应时间之间的间隔&#xff1a;Time.deltaTime 1.6 对应测试代码 1.7 需要关注的2个基本…...

系统思考—转型

“我知道自己有问题&#xff0c;但问题到底出在哪里&#xff1f;” 很多中小企业主都会在这样的迷茫中徘徊。市场变化太快、团队执行力不强、内部沟通不畅……这些问题似乎无处不在。但其实&#xff0c;真正让企业陷入困境的&#xff0c;并不是问题本身&#xff0c;而是——看…...

Java面试题2025-设计模式

1.说一下开发中需要遵守的设计原则&#xff1f; 设计模式中主要有六大设计原则&#xff0c;简称为SOLID &#xff0c;是由于各个原则的首字母简称合并的来(两个L算一个,solid 稳定的)&#xff0c;六大设计原则分别如下&#xff1a; 1、单一职责原则 单一职责原则的定义描述非…...

本地Harbor仓库搭建流程

Harbor仓库搭建流程 本文主要介绍如何搭建harbor仓库&#xff0c;推送本地镜像供其他机器拉取构建服务 harbor文档&#xff1a;Harbor 文档 | 配置 Harbor YML 文件 - Harbor 中文 github下载离线安装包 Releases goharbor/harbor 这是harbor的GitHub下载地址&#xff0c…...

爬虫基础之爬取某基金网站+数据分析

声明: 本案例仅供学习参考使用&#xff0c;任何不法的活动均与本作者无关 网站:天天基金网(1234567.com.cn) --首批独立基金销售机构-- 东方财富网旗下基金平台! 本案例所需要的模块: 1.requests 2.re(内置) 3.pandas 4.pyecharts 其他均需要 pip install 模块名 爬取步骤: …...

Qt调用FFmpeg库实时播放UDP组播视频流

基于以下参考链接&#xff0c;通过改进实现实时播放UDP组播视频流 https://blog.csdn.net/u012532263/article/details/102736700 源码在windows&#xff08;qt-opensource-windows-x86-5.12.9.exe&#xff09;、ubuntu20.04.6(x64)(qt-opensource-linux-x64-5.12.12.run)、以…...

YOLOv10改进,YOLOv10检测头融合DynamicHead,添加小目标检测层(四头检测)+CA注意机制,全网首发

摘要 作者提出一种新的检测头,称为“动态头”,旨在将尺度感知、空间感知和任务感知统一在一起。如果我们将骨干网络的输出(即检测头的输入)视为一个三维张量,其维度为级别 空间 通道,这样的统一检测头可以看作是一个注意力学习问题,直观的解决方案是对该张量进行全自…...

【ComfyUI专栏】推荐几个常用的云端ComfyUI平台

如果我们本身的系统资源不足&#xff0c;但是我们依然能够使用显卡来利用ComfyUI生成我们需要的图片或者视频。当前平台中主要有两个不同的廉价平台提供了ComfyUI的功能&#xff0c;这里提供的资源基本上都是基于分钟进行计算。这些平台的好处就是基本上不需要你额外进行配置。…...

std::pair源码:operator=被delete了,提供的是sfinae版本

D:\DevTools\VS2017\VC\Tools\MSVC\14.16.27023\include\utility pair& operator(const volatile pair&) delete;真正版本&#xff1a;template<class _Other1 _Ty1,class _Other2 _Ty2,enable_if_t<conjunction_v<is_assignable<_Ty1&, const _Oth…...

数据要素白皮书(2024年)(解读+全文阅读)

数据要素白皮书&#xff08;2024年&#xff09;》由中国通信标准化协会大数据技术标准推进委员会发布&#xff0c;版权受法律保护&#xff0c;转载需注明来源。该白皮书深入分析了当前数据要素在全球及中国的发展态势&#xff0c;并提出了关键观察与展望。 全球范围内&#xf…...

C#常用257单词

1、Visual Studio 直译&#xff1a;可视化开发环境 说明&#xff1a;简称VS&#xff0c;我们编写程序的集成开发环境&#xff0c;可以写代码、编译代码、调试代码、发布程序。 2、.Net 直译&#xff1a;dotNet 说明&#xff1a;我们常说的.net读作dotnet&#xff0c;表示网…...

禅道2024年度回顾:品牌向善,才能向上!

很高兴禅道顺利完成了2024年的跃升计划&#xff0c;并交出了一份认真的答卷&#xff01; 这一年&#xff0c;禅道的产品在变强&#xff0c;完成了产品的重构与全面升级&#xff1b; 这一年&#xff0c;禅道的朋友在变多&#xff0c;服务到更多不同行业的客户&#xff1b; 这…...

RK3568 adb使用

文章目录 一、adb介绍**ADB 主要功能****常用 ADB 命令****如何使用 ADB****总结** 二、Linux下载adb**方法 1&#xff1a;使用包管理器&#xff08;适用于 Ubuntu/Debian 系统&#xff09;****方法 2&#xff1a;通过 Snap 安装&#xff08;适用于支持 Snap 的系统&#xff09…...