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

8.观察者模式:思考与解读

原文地址:观察者模式:思考与解读  更多内容请关注:7.深入思考与解读设计模式

引言

在开发软件时,系统的某些状态可能会发生变化,而你希望这些变化能够自动通知到依赖它们的其他模块。你是否曾经遇到过,系统中某个对象发生了变化,但你不想让其他对象频繁地去询问这个变化,或者你不希望每次变化时都手动通知这些对象?

如果可以有一种方式,当对象的状态发生变化时,所有依赖该对象的其他对象都能自动得到通知并做出响应,这样的设计是否会让你的系统更加松耦合且易于维护?

这正是观察者模式的目的。观察者模式通过定义一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会收到通知。你是否觉得,这样的模式能够减少系统中对象之间的耦合,使得系统更加灵活?

在这篇文章中,我们将通过一系列问题,逐步引导你理解观察者模式的核心思想、应用场景以及如何实现它。

什么是观察者模式?

问题1:在软件设计中,如果有一个对象发生了变化,你通常如何通知其他依赖它的对象?

假设你有一个系统,其中有一个对象的状态变化会影响到其他多个对象。你是如何让这些依赖对象知道这个变化的?是否有一种方法,让这些对象在不询问的情况下,自动获取到最新的状态?

问题2:你是否曾经使用过“事件监听器”或“回调”机制?这些方法是否能够灵活地处理对象之间的依赖关系?

事件监听器和回调机制在某些场景下是非常有用的,但它们通常会带来强耦合。而观察者模式则能够更灵活地处理一对多的依赖关系。你是否想过,是否有一种设计模式能够解决这种问题?

观察者模式正是解决这个问题的一种有效设计模式,它通过“观察者”来自动通知依赖对象,而不需要依赖对象主动查询。

观察者模式的核心概念

问题3:观察者模式通常由哪些角色组成?每个角色的职责是什么?

观察者模式包含以下几个核心角色:

  1. 主题(Subject):被观察的对象,通常包含一个状态,当它的状态发生变化时,会通知所有注册的观察者。

  2. 观察者(Observer):依赖于主题的对象,当主题发生变化时,观察者会得到通知并进行相应的处理。

  3. 具体主题(ConcreteSubject):实现了主题接口,维护观察者列表,并在状态变化时通知它们。

  4. 具体观察者(ConcreteObserver):实现了观察者接口,响应主题的变化。

你能理解这些角色是如何相互协作,确保在主题变化时,观察者能够自动得到通知吗?

问题4:在观察者模式中,主题与观察者是如何解耦的?它们是如何通过某种机制进行通信的?

观察者模式的关键是,主题不需要知道具体有哪些观察者,它只需要维护一个观察者的列表,并在状态变化时通知所有的观察者。你能理解,这样的设计是如何让系统中的各个部分更加解耦的?

观察者模式的实现

让我们通过一个简单的例子来理解观察者模式的实现。假设你正在开发一个天气预报系统,系统中有多个展示天气信息的应用(例如,手机应用、网页应用等),当天气数据发生变化时,所有应用都应该被通知并更新显示的内容。

步骤1:定义观察者接口

from abc import ABC, abstractmethod# 观察者接口
class Observer(ABC):@abstractmethoddef update(self, temperature: float, humidity: float):pass

问题5:观察者接口(Observer)定义了哪些方法?为什么需要一个统一的接口来保证所有观察者的行为一致?

观察者接口定义了一个update()方法,所有观察者都必须实现这个方法。你是否理解,为什么这种方式能够确保所有观察者在状态变化时都能得到统一的通知,并进行相应的处理?

步骤2:定义主题接口
class Subject(ABC):@abstractmethoddef register_observer(self, observer: Observer):pass@abstractmethoddef remove_observer(self, observer: Observer):pass@abstractmethoddef notify_observers(self):pass

问题6:主题接口(Subject)需要提供哪些方法来管理观察者?它为什么需要register_observer()remove_observer()notify_observers()方法?

主题接口通过register_observer()remove_observer()notify_observers()来管理观察者列表。你是否理解,为什么这些方法是观察者模式的核心?它们如何帮助主题管理观察者,并在状态变化时通知所有观察者?

步骤3:定义具体主题类
class WeatherStation(Subject):def __init__(self):self._observers = []self._temperature = 0.0self._humidity = 0.0def register_observer(self, observer: Observer):self._observers.append(observer)def remove_observer(self, observer: Observer):self._observers.remove(observer)def notify_observers(self):for observer in self._observers:observer.update(self._temperature, self._humidity)def set_weather_data(self, temperature: float, humidity: float):self._temperature = temperatureself._humidity = humidityself.notify_observers()  # 当天气数据变化时通知所有观察者

问题7:具体主题类(WeatherStation)如何管理观察者,并在状态变化时通知它们?

WeatherStation类维护一个观察者列表,并通过notify_observers()方法通知所有观察者。你是否能理解,为什么我们通过set_weather_data()方法来触发状态变化,并通知所有的观察者?

步骤4:定义具体观察者类
class PhoneApp(Observer):def update(self, temperature: float, humidity: float):print(f"Phone App: Weather updated! Temperature: {temperature}°C, Humidity: {humidity}%")class WebApp(Observer):def update(self, temperature: float, humidity: float):print(f"Web App: Weather updated! Temperature: {temperature}°C, Humidity: {humidity}%")

问题8:具体观察者类(如PhoneAppWebApp)是如何响应主题的变化的?它们为什么需要实现update()方法?

具体观察者类实现了update()方法,并在该方法中处理主题状态变化后的逻辑(如更新显示)。你是否理解,为什么观察者需要根据主题的变化来更新自己的状态,而这种更新是自动触发的?

步骤5:客户端代码
def main():weather_station = WeatherStation()phone_app = PhoneApp()web_app = WebApp()weather_station.register_observer(phone_app)weather_station.register_observer(web_app)weather_station.set_weather_data(25.5, 60)  # 模拟天气数据变化weather_station.set_weather_data(30.0, 65)  # 再次模拟天气数据变化if __name__ == "__main__":main()

问题9:在客户端代码中,如何通过主题对象来注册观察者,并触发通知?当天气数据发生变化时,如何确保所有观察者都能接收到通知?

客户端通过register_observer()方法注册观察者对象,当天气数据变化时,WeatherStation通过调用notify_observers()通知所有注册的观察者。你是否理解,这种机制如何保证了在状态变化时,所有依赖对象(观察者)都能自动响应?

观察者模式的优缺点

问题10:观察者模式的优点是什么?它如何帮助我们解耦系统中的不同模块?

观察者模式通过将主题与观察者解耦,避免了直接依赖关系,使得系统更加灵活和可扩展。你是否理解,这种设计如何帮助你在不修改主题类的情况下,轻松增加新的观察者?同时,观察者也不需要知道主题类的具体实现。

问题11:观察者模式的缺点是什么?它在某些情况下是否会导致性能问题或过度通知?

虽然观察者模式非常灵活,但在某些情况下,当有大量观察者时,可能会导致性能问题。你是否认为,如果观察者数量过多,通知的效率可能成为瓶颈?或者,是否可能存在不必要的通知?

适用场景

问题12:你能想到哪些场景,观察者模式能够发挥作用?

观察者模式适用于以下场景:

  • 当多个对象依赖于某个对象的状态变化时。

  • 当你需要将事件驱动机制引入系统时。

你能想到其他场景吗?例如,用户界面的事件监听、股票市场的价格更新等,是否也可以使用观察者模式?

问题13:观察者模式是否适用于所有场景?在某些情况下,是否有更合适的设计模式?

观察者模式适用于需要多方监听和响应的场景,但如果对象之间的依赖较少,或者没有动态更新的需求,是否可以使用更简单的设计模式?

接下来,我们将通过具体的代码示例来加深理解观察者模式。

观察者模式深入解读

一、引言

观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某个主题对象。当主题对象的状态发生变化时,所有依赖于它的观察者都会得到通知并自动更新。观察者模式通常用于事件处理系统,比如用户界面、消息通知系统等。


二、简单理解:什么是观察者模式?

1. 什么是观察者模式?

观察者模式的核心思想是:当一个对象的状态发生改变时,所有依赖于它的对象都会自动得到通知并更新。这个模式常用于一种场景:当数据发生变化时,其他对象需要得到变化的通知并作出响应。

通俗地讲,观察者模式就像是你订阅了一家新闻网站,每当该网站发布了新的新闻,你就会收到通知。你不需要主动去检查网站是否有新新闻,而是当新闻发生变化时,系统会自动通知你。

2. 观察者模式的组成部分

观察者模式通常包含以下几个部分:

  • 主题(Subject):维护一组观察者,并在状态变化时通知所有观察者。

  • 观察者(Observer):定义一个更新接口,供主题在状态发生变化时调用。

  • 具体主题(ConcreteSubject):实现主题接口,保存状态,并在状态变化时通知观察者。

  • 具体观察者(ConcreteObserver):实现观察者接口,根据主题的状态变化做出响应。


三、用自己的话解释:如何理解观察者模式?

1. 类比实际生活中的场景

假设你是一家杂志的订阅者,每当这本杂志出版新一期时,你都会收到邮件通知。这时候,你是“观察者”,杂志社是“主题”,每当杂志社发布新内容时,它会通知所有订阅的读者。

在编程中,观察者模式通常应用于一对多的关系,当一个对象的状态变化时,其他对象会被通知并自动更新。比如,用户界面中一个输入框的值发生变化时,其他依赖于这个输入框值的组件(如显示结果的标签、搜索框等)会自动更新。

2. 为什么要使用观察者模式?

观察者模式的主要优势在于,它通过松耦合的方式管理对象之间的依赖关系。观察者与主题之间没有直接的连接,主题只知道观察者的接口,不知道具体的实现,这使得系统更加灵活和可扩展。


四、深入理解:观察者模式的实现

接下来,我们通过一个具体的代码示例来实现观察者模式,帮助你更好地理解如何在代码中使用这个模式。

示例:新闻推送系统

假设我们要开发一个新闻推送系统,用户可以订阅不同的新闻类型。当有新的新闻发布时,所有订阅该类型的用户都会收到通知。

1. 定义观察者接口
# 观察者接口:定义更新方法
class Observer:def update(self, message: str):pass
2. 定义主题接口
# 主题接口:定义注册、移除观察者的方法
class Subject:def register_observer(self, observer: Observer):passdef remove_observer(self, observer: Observer):passdef notify_observers(self):pass
3. 定义具体主题类:新闻发布
# 具体主题类:新闻发布
class NewsPublisher(Subject):def __init__(self):self._observers = []self._latest_news = ""def register_observer(self, observer: Observer):self._observers.append(observer)def remove_observer(self, observer: Observer):self._observers.remove(observer)def notify_observers(self):for observer in self._observers:observer.update(self._latest_news)def set_latest_news(self, news: str):self._latest_news = newsself.notify_observers()  # 状态变化时通知所有观察者
4. 定义具体观察者类:用户
# 具体观察者类:用户
class User(Observer):def __init__(self, name: str):self._name = namedef update(self, message: str):print(f"{self._name} received news: {message}")
5. 客户端代码:订阅新闻
# 创建新闻发布者实例
news_publisher = NewsPublisher()# 创建用户实例
user1 = User("Alice")
user2 = User("Bob")# 用户订阅新闻
news_publisher.register_observer(user1)
news_publisher.register_observer(user2)# 发布新闻
news_publisher.set_latest_news("Breaking: New python version released!")# 取消某个用户的订阅
news_publisher.remove_observer(user2)# 再次发布新闻
news_publisher.set_latest_news("Update: Python tutorial available!")
代码解析:
  1. Observer 类:这是观察者接口,定义了 update 方法,主题会通过这个方法通知观察者更新。

  2. Subject 类:这是主题接口,定义了 register_observerremove_observer 和 notify_observers 方法,用来管理观察者的注册、移除和通知。

  3. NewsPublisher 类:这是具体的主题类,继承了 Subject,并实现了管理观察者和通知更新的逻辑。当有新的新闻发布时,它会调用 notify_observers 方法,通知所有注册的观察者。

  4. User 类:这是具体的观察者类,继承了 Observer,当主题状态变化时,通过 update 方法接收到新新闻的通知。

  5. 客户端代码:创建新闻发布者和多个用户,用户订阅新闻发布,发布者通知所有订阅的用户更新。


五、解释给别人:如何讲解观察者模式?

1. 用简单的语言解释

观察者模式就像是你订阅了一个新闻频道,每当有新新闻发布时,你都会收到通知。你不需要时刻查看新闻网站,而是当新闻变化时,你会自动收到更新。它让你能跟随某个变化的对象,而不用频繁地查询该对象。

2. 为什么要使用观察者模式?

使用观察者模式的好处是,它让系统的各个组件之间通过接口解耦。主题和观察者之间没有直接的依赖,主题只知道观察者的接口,并且通过通知机制来更新观察者。当有新观察者加入或离开时,主题不需要做太多改动,从而提高了系统的灵活性和扩展性。


六、总结

通过一系列问题的引导,我们逐步理解了观察者模式的核心思想和实现方式。观察者模式通过定义一对多的依赖关系,使得当一个对象的状态发生变化时,所有依赖对象能够自动接收到通知并做出响应。它让系统更加松耦合,灵活且可扩展。

通过以上过程,我们可以得出以下结论:

  • 观察者模式 是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某个主题对象。当主题对象的状态发生变化时,所有依赖于它的观察者都会得到通知并自动更新。

  • 它的主要优点是解耦、灵活性和扩展性,尤其适用于事件驱动或消息推送的场景。

  • 观察者模式的应用非常广泛,例如 GUI 组件、事件处理、推送通知系统等。

观察者模式的优点:
  • 松耦合:观察者和主题之间没有直接依赖,便于扩展和维护。

  • 扩展性:可以灵活地增加或移除观察者,而不影响主题。

  • 易于实现:适合实现一对多的通信关系,尤其在实时更新场景中非常有用。

观察者模式的缺点:
  • 可能导致性能问题:如果观察者数量非常多,可能会影响通知效率。

  • 依赖复杂:如果观察者和主题之间有太多复杂的依赖,可能会导致系统的理解和维护难度增加。

相关文章:

8.观察者模式:思考与解读

原文地址:观察者模式:思考与解读 更多内容请关注:7.深入思考与解读设计模式 引言 在开发软件时,系统的某些状态可能会发生变化,而你希望这些变化能够自动通知到依赖它们的其他模块。你是否曾经遇到过,系统中某个对象…...

13.编码器的结构

从入门AI到手写Transformer-13.编码器的结构 13.编码器的结构代码 整理自视频 老袁不说话 。 13.编码器的结构 T r a n s f o r m e r E n c o d e r : 输入 [ b , n ] TransformerEncoder:输入[b,n] TransformerEncoder:输入[b,n] E m b e d d i n g : − > [ b , n , d ]…...

java 设计模式之模板方法模式

简介 模板方法模式:定义一个算法的基本流程,将一些步骤延迟到子类中实现。模板方法模式可以提高代码的复用性, 模板方法中包含的角色: 抽象类:负责给出一个算法的基本流程,它由一个模板方法和若干个基本…...

C++面向对象

面向对象的思想 面向过程: 根据程序的执行过程,来设计软件的所有细节。面向过程的缺点:开发大型项目时,越来越难以把控,甚至失去控制。后期维护、更新成本很大。解决方案:使用面向对象。 什么是面向对象…...

守护进程编程

目录 一、守护进程 1.1 守护进程概述 1.2 守护进程的功能及特点 1.2.1 守护进程的功能 1.2.2 守护进程的特点 1.3 主要过程 1.4 阿里云服务器编程实现守护进程 1.4.1 daemon 命令 1.4.2 nohup命令 1.4.3 fork()编程实现 1.5 在树莓派中通过三种方式创建守护进程 1.5…...

【Spring Boot 源码学习】深入 ConfigurableEnvironment 的初始化过程

《Spring Boot 源码学习系列》 深入 ConfigurableEnvironment 的初始化过程 一、引言二、配置环境的初始化2.1 源码总览2.2 prepareEnvironment 方法2.2.1 获取或创建可配置环境2.2.2 配置环境并设置参数2.2.3 将配置属性源附加到环境中2.2.4 触发环境准备事件2.2.5 将DefaultP…...

若依集成BladeX单点登录的令牌管理与api请求流程

目录 概述系统架构单点登录流程令牌管理机制接口调用流程关键代码实现数据结构安全性考虑常见问题与解决 概述 本文档详细说明若依系统如何实现与BladeX的单点登录集成,包括令牌管理和接口调用的完整流程。整个集成采用基于OAuth2的授权码流程,允许用…...

54常用控件_QLCDNumber的属性

目录 代码示例: 倒计时 QLCDNumer 是一个专门用来显示数字的控件.类似于“老式计算器”的效果 核心属性 属性 说明 intValue QLCDNumber显示的数字值(int). value QLCDNumber 显示的数字值(double). 和intValue是联动的. 例如给value设为1.5, intValue的值就是2. 另外&a…...

IcePlayer音乐播放器项目分析及学习指南

IcePlayer音乐播放器项目分析及学习指南 项目概述 IcePlayer是一个基于Qt5框架开发的音乐播放器应用程序,使用Visual Studio 2013作为开发环境。该项目实现了音乐播放、歌词显示、专辑图片获取等功能,展现了桌面应用程序开发的核心技术和设计思想。 技…...

【ELF2学习板】Ne10进行FFT测试

目录 引言 Ne10简介 交叉编译Ne10 测试 测试程序 测试结果 结语 引言 在上一篇博文介绍了FFTW在ELF2开发板的测试。其中我们提到--enable-neon选项在aarch64平台下无法启用。接下来测试一个专门用NEON指令优化的FFT库Ne10。 Ne10简介 NE10 是一个面向 ARM 架构的开源数…...

Android device PCO (protocol configuration options) intro

术语 英文缩写英文全称中文PCOprotocol configuration options协议配置选项RILradio interface layer 无线电接口层PCO介绍 PCO(Protocol Configuration Options) 是 3GPP 标准协议(TS 24.008)中定义的核心概念,用于在 LTE/5G 网络建立 PDN 连接时传递动态配置参数(如 D…...

HAL库通过FATFS和SDIO+DMA写入SD卡数据错误

HAL库F4版本 1.28.1 最近在使用HAL库配置SDIODMA并通过FATFS向SD卡写入数据,但是发现写入的数据经常有错误,不是少了一部分就是多了一部分,写入的数据为csv格式,通过循环向缓冲区写入"100100,12.345678\r\n"数据来观察问…...

RK Android11 修改默认语言为法语及时区为巴黎时间

文章目录 1、需求2、解决 1、需求 客户要求将系统默认语言改为法语,系统默认时区改为巴黎时间(也称为欧洲中部时间)2、解决 --- a/build/make/tools/buildinfo.shb/build/make/tools/buildinfo.sh-46,7 46,7 echo "ro.product.cpu.ab…...

文件上传Ⅰ

文件上传--前后端验证 不让上传php,所以要绕过它 遇到网站可能不是php语言,会是java或者python语言等,它只能解析网站本身的语言,那我们就上传符合网站语言识别的格式(它能解析什么后缀,就上传什么后缀)&…...

IntelliJ IDEA clean git password

IntelliJ IDEA clean git password 清除git密码 方法一:(这个要特别注意啊,恢复默认设置,你的插件什么要重新下载了) File->Manage IDE Settings->Restore Default Settings以恢复IDEA的默认设置(可选); 清空…...

【C++指南】哈希驱动的封装:如何让unordered_map/set飞得更快更稳?【上】

🌟 各位看官好,我是egoist2023! 🌍 种一棵树最好是十年前,其次是现在! 💬 注意:本文在哈希函数中主讲除法散列法,乘法散列法、全域散列法、双重散列等自行了解。 &#x…...

论坛测试报告

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 ​🎂 作者介绍: 🎂🎂 🎂 🎉🎉&#x1f389…...

人脸扫描黑科技:多相机人脸扫描设备,打造你的专属数字分身

随着科技的迅猛发展,人脸扫描这个词已经并不陌生,通过人脸扫描设备制作超写实人脸可以为影视制作打造逼真角色、提升游戏沉浸感,还能助力教育机构等领域生产数字人以丰富教学资源,还在安防、身份识别等领域发挥关键作用&#xff0…...

统计字符串每个字符出现频率

输入一个字符串&#xff0c;统计每个字符的出现频率&#xff0c;然后判断最大频率与最小频率的差值 cnt&#xff1a; 如果 cnt 是质数&#xff0c;则输出 "Lucky Word" 和 差值&#xff1b; 否则输出 "No Answer" 和 0。 #include <bits/stdc.h> u…...

SQL-子查询

SQL子查询是嵌套在另一个SQL查询中的SELECT语句&#xff0c;将内部查询的结果作为外部查询的条件或者数据源。 核心概念 子查询是一个完整的SELECT语句&#xff0c;可以嵌入到其他查询的where, from, SELECT, HAVING等子句中&#xff0c;用于动态生成条件或临时数据集。 例如…...

Python(21)Python日期时间完全指南:从基础到实战注意事项

目录 一、背景与核心价值二、核心模块详解与实战2.1 datetime模块四剑客2.2 时区处理黄金法则 三、企业级应用案例3.1 全球日志分析系统3.2 金融交易时间校验 四、六大核心注意事项1. 时区意识优先原则‌2. 时间戳的精度陷阱‌3. 夏令时转换三步骤4. 日期格式化安全指南‌5. 性…...

【医学影像 AI】早产儿视网膜病变国际分类(第三版)

【医学影像 AI】早产儿视网膜病变国际分类&#xff08;第三版&#xff09; 0. 论文简介0.1 基本信息0.2 摘要0.3 缩略语0.4 ICROP3的关键内容总结 1. 引言2. 血管化位置&#xff1a;区域&#xff08;ZONE&#xff09;3. 加重病变与前加重病变4. 急性病变分期&#xff08;阶段1-…...

焊接机器人的设计

一、引言 随着制造业的发展&#xff0c;焊接工艺在各个领域得到广泛应用。焊接机器人具有焊接质量高、效率高、劳动强度低等优点&#xff0c;能够满足现代制造业对焊接生产的要求。设计一款性能优良的焊接机器人&#xff0c;对于提高焊接生产的自动化水平和产品质量具有重要意…...

SQL SERVER里面也可以插入存储过程,操作TCP,WEBSOCKET吗?数据发生改变时用于通知客户端

SQL SERVER里面也可以插入存储过程,操作TCP,WEBSOCKET吗?数据发生改变时用于通知客户端SQL存储过程入门&#x1f525; - 人生得E不早朝 深度思考完成 用时28秒 好的&#xff0c;用户的问题是&#xff1a;SQL Server里面是否可以通过插入存储过程来操作TCP或WebSocket&…...

利用 DeepSeek-R1 模型和计算机视觉微调模型实现马铃薯叶片疾病识别和分类

一、需求背景 在农业现代化进程中&#xff0c;作物健康监测对于保障粮食安全和提高农业生产效率起着举足轻重的作用。马铃薯作为全球重要的粮食作物之一&#xff0c;其种植面积广泛&#xff0c;产量和质量直接关系到众多农户的生计以及食品供应链的稳定。准确、快速地鉴别马铃…...

文章记单词 | 第39篇(六级)

一&#xff0c;单词释义 themselves [əmˈselvz] pron. 他们自己&#xff1b;她们自己&#xff1b;它们自己&#xff1b;&#xff08;用以加强语气&#xff09;他们亲自&#xff0c;她们亲自&#xff0c;它们亲自&#xff1b;&#xff08;反身代词&#xff09; 指某人或某物本…...

深入理解C++中string的深浅拷贝

目录 一、引言 二、浅拷贝与深拷贝的基本概念 2.1 浅拷贝 2.2 深拷贝 在C 中&#xff0c; string 类的深浅拷贝有着重要的区别。 浅拷贝 深拷贝 string 类中的其他构造函数及操作 resize 构造 构造&#xff08;赋值构造&#xff09; 构造&#xff08;拼接构造&#xf…...

C++ 常用的智能指针

C 智能指针 一、智能指针类型概览 C 标准库提供以下智能指针&#xff08;需包含头文件 <memory>&#xff09;&#xff1a; unique_ptr&#xff1a;独占所有权&#xff0c;不可复制&#xff0c; 可移动shared_ptr&#xff1a;共享所有权&#xff0c;用于引用计数weak_pt…...

【AI部署】腾讯云GPU-常见故障—SadTalker的AI数字人视频—未来之窗超算中心 tb-lightly

ERROR: Could not find a version that satisfies the requirement tb-nightly (from torchreid) (from versions: none) ERROR: No matching distribution found for tb-nightly 解决 阿里云 python -m pip install tb-nightly -i https://mirrors.aliyun.com/pypi/simple …...

三大等待和三大切换

三大等待 1、三大等待&#xff1a;等待的方式有三种&#xff1a;强制等待&#xff0c;隐性等待&#xff0c;显性等待。 1、强制等待&#xff1a;time.sleep(2)&#xff0c;秒 优点&#xff1a;使用简单缺点&#xff1a;等待时间把握不准&#xff0c;容易造成时间浪费或者等待时…...

工程化实践:Flutter项目结构与规范

工程化实践&#xff1a;Flutter项目结构与规范 在Flutter项目开发中&#xff0c;良好的工程化实践对于提高开发效率、保证代码质量和团队协作至关重要。本文将从项目结构、代码规范、CI/CD流程搭建以及包管理等方面&#xff0c;详细介绍Flutter项目的工程化最佳实践。 项目结…...

数据结构-Map和Set

文章目录 1. 搜索树2. Map3. Set4. 哈希表4.1 哈希表的基本概念4.2 哈希表的实现方法4.3 Java中的哈希表实现 5. 哈希桶哈希桶的实现方式哈希桶的作用哈希桶的应用模拟实现 1. 搜索树 二叉搜索树&#xff08;Binary Search Tree, BST&#xff09;是一种特殊的二叉树&#xff0…...

cpolar 内网穿透 实现公网可以访问本机

1、登录网站&#xff0c;升级成专业版&#xff0c;测试的话建议选一个月付费&#xff0c;选择预留 2、保留的TCP地址增加一条记录&#xff0c;描述可以自己取 3、验证&#xff0c;生成一个Authtocken码 4、在安装目录下&#xff0c;打开CMD命令&#xff0c;复制上面的码运行aut…...

QT调用ffmpeg库实现视频录制

可以通过QProcess调用ffmpeg命令行,也可以直接调用ffmpeg库,方便。 调用库 安装ffmpeg ffmpeg -version 没装就装 sudo apt-get update sudo apt-get install ffmpeg sudo apt-get install ffmpeg libavdevice-dev .pro引入库路径,引入库 LIBS += -L/usr/lib/aarch64-l…...

AI专题(一)----NLP2SQL探索以及解决方案

前面写了很多编码、算法、底层计算机原理等相关的技术专题&#xff0c;由于工作方向调整的缘故&#xff0c;今天开始切入AI人工智能相关介绍。本来按照规划&#xff0c;应该先从大模型的原理开始介绍会比较合适&#xff0c;但是计划赶不上变化&#xff0c;前面通用大模型的工作…...

Redis 的指令执行方式:Pipeline、事务与 Lua 脚本的对比

Pipeline 客户端将多条命令打包发送&#xff0c;服务器顺序执行并一次性返回所有结果。可以减少网络往返延迟&#xff08;RTT&#xff09;以提升吞吐量。 需要注意的是&#xff0c;Pipeline 中的命令按顺序执行&#xff0c;但中间可能被其他客户端的命令打断。 典型场景&…...

群辉默认docker数据存储路径

做一下笔记 今天不小心路径规划错误&#xff0c;好不容易找到了数据&#xff0c;特此做个路径记录。 /var/packages/ContainerManager/var/docker/...

【C++】入门基础【上】

目录 一、C的发展历史二、C学习书籍推荐三、C的第一个程序1、命名空间namespace2、命名空间的使用3、头文件<iostream>是干什么的&#xff1f; 个人主页<—请点击 C专栏<—请点击 一、C的发展历史 C的起源可以追溯到1979年&#xff0c;当时Bjarne Stroustrup(本…...

Git LFS 学习笔记:原理、配置、实践与心路历程

最近在学习 Git LFS&#xff0c;把一些零散的笔记整理成一篇博文&#xff0c;记录我的学习思路与心路历程。以下内容均为个人理解总结&#xff0c;部分尚未在生产项目中验证&#xff0c;仅供回顾与参考。 &#x1f50d; Git LFS 是什么&#xff1f;原理是什么&#xff1f; 刚接…...

SpringBoot集成oshi 查询系统数据

实现功能&#xff1a; ​​​​​​​ <!-- 获取系统信息 --><dependency><groupId>com.github.oshi</groupId><artifactId>oshi-core</artifactId><version>6.6.1</version></dependency><dependency><groupI…...

iOS Facebook 登录

iOS Facebook 登录 官方文档 SDK下载链接...

uniapp打包IOS私钥证书过期了,如何在非mac系统操作

在非Mac系统下解决uniapp打包iOS私钥证书过期的问题&#xff0c;需通过以下步骤实现&#xff1a; --- ### **一、重新生成iOS证书&#xff08;非Mac环境操作&#xff09;** 1. **生成私钥和CSR文件** 使用OpenSSL工具&#xff08;需提前安装&#xff09;生成私钥和证书签…...

Axios的使用

Axios 是一个基于 Promise 的现代化 HTTP 客户端库&#xff0c;专为浏览器和 Node.js 设计。在企业级应用中&#xff0c;它凭借以下核心优势成为首选方案&#xff1a; 一、Axios 的核心优势 特性说明Promise 支持天然支持异步编程&#xff0c;避免回调地狱拦截器机制可全局拦截…...

第八篇:系统分析师第三遍——3、4章

目录 一、目标二、计划三、完成情况四、意外之喜(最少2点)1.计划内的明确认知和思想的提升标志2.计划外的具体事情提升内容和标志 五、总结 一、目标 通过参加考试&#xff0c;训练学习能力&#xff0c;而非单纯以拿证为目的。 1.在复习过程中&#xff0c;训练快速阅读能力、掌…...

【2025-泛计算机类-保研/考研经验帖征集】

【2025-泛计算机类-保研/考研经验帖征集】 打扰您1分钟时间看下这里&#xff1a; 这是一个无偿为爱发电的项目&#xff0c;旨在收集湖南大学2025届毕业的计算机类学科同学的经验帖&#xff0c; 我将定期汇总链接&#xff0c;在校内推免群中宣传&#xff0c;为校内的学弟学妹们…...

Flink介绍——实时计算核心论文之Kafka论文详解

引入 我们通过S4和Storm论文的以下文章&#xff0c;已经对S4和Storm有了不错的认识&#xff1a; S4论文详解S4论文总结Storm论文详解Storm论文总结 不过&#xff0c;在讲解这两篇论文的时候&#xff0c;我们其实没有去搞清楚对应的流式数据是从哪里来的。虽然S4里有Keyless …...

细节:如何制作高质量的VR全景图

细节&#xff1a;如何制作高质量的VR全景图 VR全景图是通过虚拟现实和3D技术实现的全景展示方式&#xff0c;能够将实景以1:1的比例等比复刻&#xff0c;并还原到互联网上&#xff0c;使用户能够在线上游览世界&#xff0c;获得沉浸式的体验。制作高质量的VR全景图是一个复杂而…...

深度学习中的概念——元素积(哈达玛积)

元素积操作&#xff08;哈达玛积&#xff09; &#x1f522; 基本定义 矩阵的哈达玛积 对于两个同维度的矩阵&#xff1a; A [ a i j ] , B [ b i j ] A [a_{ij}], \quad B [b_{ij}] A[aij​],B[bij​] 它们的哈达玛积定义为&#xff1a; C A ∘ B 其中 c i j a i j…...

探索 Flowable 后端表达式:简化流程自动化

什么是后端表达式&#xff1f; 在 Flowable 中&#xff0c;后端表达式是一种强大的工具&#xff0c;用于在流程、案例或决策表执行期间动态获取或设置变量。它还能实现自定义逻辑&#xff0c;或将复杂逻辑委托…… 后端表达式在 Flowable 的后端运行&#xff0c;无法访问前端…...

AI语音助手 React 组件使用js-audio-recorder实现,将获取到的语音转成base64发送给后端,后端接口返回文本内容

页面效果&#xff1a; js代码&#xff1a; import React, { useState, useRef, useEffect } from react; import { Layout, List, Input, Button, Avatar, Space, Typography, message } from antd; import { SendOutlined, UserOutlined, RobotOutlined, AudioOutlined, Stop…...