InternetOpen InternetOpenUrl InternetReadFile 和 InternetCloseHandle

article/2025/9/24 13:20:57

文章目录

    • InternetOpen
    • 函数功能
    • 函数声明
    • 第一个参数
    • 第二个参数
    • 第三个参数
    • 第四个参数
    • 第五个参数
    • 返回值
    • 补充:
    • InternetOpenUrl
    • 函数功能
    • 函数声明
    • 第一个参数
    • 第二个参数
    • 第三个参数
    • 第四个参数
    • 第五个参数
    • 第六个参数
    • 返回值
    • 补充
    • 补充
    • InternetReadFile
    • 函数功能
    • 函数声明
    • 第一个参数
    • 第二个参数
    • 第三个参数
    • 第四个参数
    • 返回值
    • 补充:
    • InternetCloseHandle
    • 函数功能
    • 函数声明
    • 第一个参数
    • 返回值
    • 代码实现:

InternetOpen

函数功能

初始化应用程序对WinINet函数的使用

函数声明

INTERNETAPI_(HINTERNET) InternetOpenA(_In_opt_ LPCSTR lpszAgent,_In_ DWORD dwAccessType,_In_opt_ LPCSTR lpszProxy,_In_opt_ LPCSTR lpszProxyBypass,_In_ DWORD dwFlags);

第一个参数

指向以null终止的字符串的指针,该字符串指定调用WinINet函数的应用程序或实体的名称。该名称在HTTP协议中用作用户代理

第二个参数

所需的访问类型。此参数可以是下列值之一

含义
INTERNET_OPEN_TYPE_DIRECT在本地解析所有主机名。
INTERNET_OPEN_TYPE_PRECONFIG从注册表中检索代理或直接配置。
INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY从注册表中检索代理或直接配置,并阻止使用启动的Microsoft JScript或Internet安装程序(INS)文件。
INTERNET_OPEN_TYPE_PROXY将请求传递到代理,除非提供了代理绕过列表,并且要解析的名称绕过了代理。在这种情况下,该函数使用 INTERNET_OPEN_TYPE_DIRECT。

第三个参数

指向以null终止的字符串的指针,该字符串指定通过将dwAccessType设置为 INTERNET_OPEN_TYPE_PROXY来指定代理访问时要使用的代理服务器的名称 。不要使用空字符串,因为 InternetOpen会将其用作代理名称。WinINet函数仅识别CERN类型的代理(仅HTTP)和TIS FTP网关(仅FTP)。如果安装了Microsoft Internet Explorer,则这些功能还支持SOCKS代理。可以通过CERN类型的代理将FTP请求更改为HTTP请求或使用 InternetOpenUrl来进行。如果 dwAccessType未设置为 INTERNET_OPEN_TYPE_PROXY,此参数将被忽略,并且应该为NULL。有关列出代理服务器的更多信息,请参阅“启用Internet功能”的“ 列出代理服务器”部分 。

第四个参数

指向以空值结尾的字符串的指针,该字符串指定主机名或IP地址(或两者)的可选列表,当dwAccessType设置为 INTERNET_OPEN_TYPE_PROXY时,不应通过代理进行路由 。该列表可以包含通配符。不要使用空字符串,因为 InternetOpen会将其用作代理绕过列表。如果此参数指定“ ”宏,则该函数绕过不包含句点的任何主机名的代理。

默认情况下,WinINet将绕过使用主机名“ localhost”,“ loopback”,“ 127.0.0.1”或“ [:: 1]”的请求的代理。存在此现象的原因在于远程代理服务器通常将无法正确解析这些地址。Internet Explorer 9: 可以使用“ <-loopback>”宏从代理绕过列表中删除本地计算机。

如果 dwAccessType未设置为 INTERNET_OPEN_TYPE_PROXY,则此参数将被忽略,并且应为NULL。

第五个参数

选项。此参数可以是以下值的组合。

含义
INTERNET_FLAG_ASYNC仅对从此函数返回的句柄派生的句柄发出异步请求。
INTERNET_FLAG_FROM_CACHE不发出网络请求。所有实体均从缓存中返回。如果所请求的项目不在缓存中,则返回适当的错误,例如ERROR_FILE_NOT_FOUND。
INTERNET_FLAG_OFFLINE与INTERNET_FLAG_FROM_CACHE相同 。不发出网络请求。所有实体均从缓存中返回。如果所请求的项目不在缓存中,则返回适当的错误,例如ERROR_FILE_NOT_FOUND。

返回值

返回应用程序传递给后续WinINet函数的有效句柄。如果 InternetOpen失败,则返回NULL。要检索特定的错误消息,请调用 GetLastError

补充:

InternetOpen是应用程序调用的第一个WinINet函数。它告诉Internet DLL初始化内部数据结构,并为将来来自应用程序的调用做准备。当应用程序完成Internet功能使用后,应调用 InternetCloseHandle释放句柄和所有相关资源。

该应用程序可以拨打InternetOpen任意数量的电话 ,尽管通常一个电话就足够了。应用程序可能需要为每个InternetOpen实例定义单独的行为,例如为每个 实例配置不同的代理服务器。

调用应用程序使用InternetOpen返回的HINTERNET句柄 完成后 ,必须使用InternetCloseHandle函数将其关闭 。

与WinINet API的所有其他方面一样,不能从DllMain或全局对象的构造函数和析构函数中安全地调用此函数。

注意:
WinINet不支持服务器实现。此外,不应在服务中使用它。对于服务器实现或服务,请使用Microsoft Windows HTTP Services(WinHTTP)

InternetOpenUrl

函数功能

打开由完整的FTP或HTTP URL指定的资源

函数声明

INTERNETAPI_(HINTERNET) InternetOpenUrlA(_In_ HINTERNET hInternet,_In_ LPCSTR lpszUrl,_In_reads_opt_(dwHeadersLength) LPCSTR lpszHeaders,_In_ DWORD dwHeadersLength,_In_ DWORD dwFlags,_In_opt_ DWORD_PTR dwContext);

第一个参数

当前Internet会话的句柄。该句柄必须已由先前对InternetOpen的调用返回 。

第二个参数

指向以空字符结尾的字符串变量的指针,该变量指定要开始读取的URL。仅支持以ftp:,http:或https:开头的URL。

第三个参数

指向以null终止的字符串的指针,该字符串指定要发送到HTTP服务器的标头。有关更多信息,请参见HttpSendRequest函数中lpszHeaders参数 的描述

第四个参数

附加标头的大小,以TCHARs为单位。如果此参数为-1L并且 lpszHeaders不为NULL, 则假定lpszHeaders为零终止(ASCIIZ)并计算长度。

第五个参数

此参数可以是下列值之一。

含义
INTERNET_FLAG_EXISTING_CONNECT如果存在的InternetConnect对象具有发出请求所需的相同属性,则尝试使用该对象。这仅对FTP操作有用,因为FTP是通常在同一会话期间执行多个操作的唯一协议。WinINet API为InternetOpen生成的每个HINTERNET句柄缓存一个连接句柄。 InternetOpenUrl 将此标志用于HTTP和FTP连接。
INTERNET_FLAG_HYPERLINK在确定是否从网络重新加载项目时,如果没有过期时间,也没有从服务器返回LastModified时间,则强制重新加载。
INTERNET_FLAG_HYPERLINK在确定是否从网络重新加载项目时,如果没有过期时间,也没有从服务器返回LastModified时间,则强制重新加载。
INTERNET_FLAG_IGNORE_CERT_CN_INVALID禁用根据请求中给定的主机名检查从服务器返回的基于SSL / PCT的证书。WinINet函数通过比较匹配的主机名和简单的通配符规则来使用对证书的简单检查。
INTERNET_FLAG_IGNORE_CERT_DATE_INVALID禁用对基于SSL / PCT的证书的有效日期进行检查
INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP禁止检测这种特殊类型的重定向。使用此标志时,WinINet透明地允许从HTTPS重定向到HTTP URL。
INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS禁用对这种特殊类型的重定向的检测。使用此标志时,WinINet透明地允许从HTTP重定向到HTTPS URL。
INTERNET_FLAG_KEEP_CONNECTION对连接使用保持活动的语义(如果可用)。对于Microsoft网络(MSN),NTLM和其他类型的身份验证,此标志是必需的。
INTERNET_FLAG_NEED_FILE如果无法缓存该文件,则导致创建一个临时文件。
INTERNET_FLAG_NO_AUTH不自动尝试身份验证
INTERNET_FLAG_NO_AUTO_REDIRECT不会自动处理HttpSendRequest中的重定向
INTERNET_FLAG_NO_CACHE_WRITE不将返回的实体添加到缓存中。
INTERNET_FLAG_NO_COOKIES不会自动向请求添加cookie标头,也不会自动将返回的cookie添加到cookie数据库。
INTERNET_FLAG_NO_UI禁用cookie对话框。
INTERNET_FLAG_PASSIVE使用被动FTP语义。 InternetOpenUrl将此标志用于FTP文件和目录。
INTERNET_FLAG_PRAGMA_NOCACHE强制请求由源服务器解决,即使代理上存在缓存的副本也是如此。
INTERNET_FLAG_RAW_DATA检索FTP目录信息时 ,以WIN32_FIND_DATA结构形式返回数据 。如果未指定此标志,或者如果调用是通过CERN代理进行的,则 InternetOpenUrl返回目录的HTML版本。Windows XP和Windows Server 2003 R2及更早版本: 检索Gopher目录信息时,还以GOPHER_FIND_DATA结构形式返回数据。
INTERNET_FLAG_RELOAD强制从源服务器(而不是从缓存)下载请求的文件,对象或目录列表。
INTERNET_FLAG_RESYNCHRONIZE如果自上次下载以来已修改资源,则重新加载HTTP资源。重新加载所有FTP资源。Windows XP和Windows Server 2003 R2及更早版本: Gopher资源也被重新加载。
INTERNET_FLAG_SECURE使用安全的事务语义。这转化为使用安全套接字层/专用通信技术(SSL / PCT),仅在HTTP请求中有意义。

第六个参数

指向变量的指针,该变量指定应用程序定义的值以及返回的句柄,该值将传递给任何回调函数。

返回值

如果成功建立连接,则返回URL的有效句柄;如果连接失败,则返回NULL。要检索特定的错误消息,请调用 GetLastError。要确定为什么拒绝访问该服务,请致电 InternetGetLastResponseInfo

补充

如果所使用的URL包含相对URL和基本URL,并用空格分隔,则首先调用 InternetCanonicalizeUrl

这是应用程序可以通过WinINet支持的任何协议检索数据的常规功能。当应用程序不需要访问协议的详细信息而只需要与URL对应的数据时,此功能特别有用。在 InternetOpenUrl中,函数解析URL字符串,建立与服务器的连接,并准备下载由URL标识的数据。然后,应用程序可以使用 InternetReadFile(用于文件)或 InternetFindNextFile(用于目录)来检索URL数据。不需要在InternetOpenUrl之前 调用 InternetConnect

Windows XP和Windows Server 2003 R2及更早版本: InternetOpenUrl在端口小于1024的端口上禁用Gopher,但端口70(标准Gopher端口)和端口105(通常用于中央服务组织(CSO)名称搜索)除外。

调用应用程序使用InternetOpenUrl返回的HINTERNET句柄 完成后 ,必须使用InternetCloseHandle函数将其关闭 。

注意 在异步模式下工作时(InternetOpen的dwFlags参数指定INTERNET_FLAG_ASYNC),并且dwContext参数为零(INTERNET_NO_CALLBACK),将不会调用在会话句柄上使用InternetSetStatusCallback设置的回调函数,但是,该调用仍将在异步模式

与WinINet API的所有其他方面一样,不能从DllMain或全局对象的构造函数和析构函数中安全地调用此函数。

补充

WinINet不支持服务器实现。此外,不应在服务中使用它。对于服务器实现或服务,请使用Microsoft Windows HTTP Services(WinHTTP)

InternetReadFile

函数功能

InternetOpenUrlFtpOpenFileHttpOpenRequest函数打开的句柄中读取数据 。

函数声明

BOOLAPI InternetReadFile(_In_ HINTERNET hFile,_Out_writes_bytes_(dwNumberOfBytesToRead) __out_data_source(NETWORK) LPVOID lpBuffer,_In_ DWORD dwNumberOfBytesToRead,_Out_ LPDWORD lpdwNumberOfBytesRead);

第一个参数

从先前对InternetOpenUrl, FtpOpenFile或 HttpOpenRequest的调用返回的句柄 。

第二个参数

指向接收数据的缓冲区的指针。

第三个参数

要读取的字节数。

第四个参数

指向一个变量的指针,该变量接收读取的字节数。 在执行任何工作或错误检查之前,InternetReadFile将此值设置为零

返回值

如果成功,则返回TRUE,否则返回FALSE。要获取扩展的错误信息,请调用 GetLastError。应用程序还可以在必要时使用 InternetGetLastResponseInfo

补充:

InternetReadFile的操作与基本的ReadFile函数非常相似 ,但有一些例外。通常, InternetReadFile从HINTERNET句柄检索数据 作为字节的顺序流。每次对InternetReadFile的调用要读取的数据量 由dwNumberOfBytesToRead参数指定, 并且该数据在lpBuffer参数中返回 。普通读取为每次InternetReadFile的调用检索指定的 dwNumberOfBytesToRead, 直到到达文件末尾。为确保检索到所有数据,应用程序必须继续调用 InternetReadFile直到该函数返回TRUE并且 lpdwNumberOfBytesRead参数等于零为止。如果将请求的数据写入缓存,这尤其重要,因为否则缓存将无法正确更新,下载的文件也不会提交到缓存。请注意,除非原始请求打开数据流的请求设置了INTERNET_FLAG_NO_CACHE_WRITE标志,否则缓存将自动发生。

当应用程序使用InternetOpenUrl检索句柄时 ,WinINet会尝试使所有数据看起来像文件下载,以使该应用程序更容易从Internet进行读取。对于某些类型的信息(例如FTP文件目录列表),它将
InternetReadFile返回的数据转换为HTML流。它逐行执行此操作。例如,它可以将FTP目录列表转换为一行HTML,然后将此HTML返回给应用程序。

WinINet尝试一次将HTML写入 lpBuffer缓冲区的一行。如果应用程序的缓冲区太小而无法容纳至少一行生成的HTML,则将返回错误代码 ERROR_INSUFFICIENT_BUFFER,以指示应用程序需要更大的缓冲区。同样,转换后的行可能不会完全填满缓冲区,因此 InternetReadFile可以返回的lpBuffer中的数据少于请求的数据 。随后的读取将检索所有已转换的HTML。应用程序必须再次检查是否如前所述检索了所有数据。

与WinINet API的所有其他方面一样,不能从DllMain或全局对象的构造函数和析构函数中安全地调用此函数。

异步运行时,如果对InternetReadFile的调用未导致完成的事务,它将返回FALSE,而对GetLastError的后续调用将返回ERROR_IO_PENDING。当交易完成InternetStatusCallback以前调用指定 InternetSetStatusCallback将被用INTERNET_STATUS_REQUEST_COMPLETE。

InternetCloseHandle

函数功能

关闭单个Internet句柄。

函数声明

BOOLAPI InternetCloseHandle(_In_ HINTERNET hInternet);

第一个参数

传入要关闭的Internet句柄

返回值

如果成功关闭句柄,则返回TRUE,否则返回FALSE。要获取扩展的错误信息,请调用 GetLastError。

补充:
该函数将终止句柄上的所有挂起操作,并丢弃所有未完成的数据。

只要不进行或将使用该句柄进行API调用,就可以安全地调用InternetCloseHandle。一旦API返回了ERROR_IO_PENDING,只要没有后续使用该句柄的API调用,调用InternetCloseHandle即可取消该I / O。

在关闭句柄的回调中调用InternetCloseHandle是安全的。如果为关闭的句柄注册了状态回调,并且使用非NULL上下文值创建了句柄,则将进行INTERNET_STATUS_HANDLE_CLOSING回调。该指示将是从句柄进行的最后一次回调,并指示该句柄已被破坏。

如果该句柄或其任何子句柄的异步请求正在等待处理,则该句柄无法立即关闭,但将无效。尝试使用该句柄的任何新请求都将返回 ERROR_INVALID_HANDLE通知。异步请求将以INTERNET_STATUS_REQUEST_COMPLETE完成。在发出最终的INTERNET_STATUS_HANDLE_CLOSING指示之前,应用程序必须准备好接收该句柄上的任何INTERNET_STATUS_REQUEST_COMPLETE指示,该指示表明该句柄已完全关闭。

应用程序可以调用 GetLastError来确定请求是否未决。如果 GetLastError返回ERROR_IO_PENDING,则在关闭句柄时存在未完成的请求。

与WinINet API的所有其他方面一样,不能从DllMain或全局对象的构造函数和析构函数中安全地调用此函数。

代码实现:

#include<windows.h>
#include<wininet.h>
#include<iostream>
using namespace std;
#pragma comment(lib,"wininet.lib")
void main()
{DWORD byteread = 0;char buffer[100];memset(buffer, 0, 100);HINTERNET internetopen;internetopen = InternetOpen("test", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);if (internetopen == NULL) {cout << "Internet open failed!" << endl;return;}HINTERNET internetopenurl;internetopenurl = InternetOpenUrl(internetopen, "https://www.ivsky.com/tupian/brussels_v62535/pic_1011959.html#al_tit", NULL, 0, INTERNET_FLAG_RELOAD, 0);if (internetopenurl == NULL) {cout << "Internet open url failed!" << endl;goto there;}BOOL hwrite;DWORD written;HANDLE createfile;createfile = CreateFile("彪哥出品,必为废品.jpg", GENERIC_WRITE, 0, 0, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0);if (createfile == INVALID_HANDLE_VALUE) {cout << "Create File failed!" << endl;goto next;}BOOL internetreadfile;while (1) {internetreadfile = InternetReadFile(internetopenurl, buffer, sizeof(buffer), &byteread);if (byteread == 0)break;hwrite = WriteFile(createfile, buffer, sizeof(buffer), &written, NULL);if (hwrite == 0) {cout << "Write to file failed!" << endl;goto here;}}cout << "Finished downloading!" << endl;here:CloseHandle(createfile);
next:InternetCloseHandle(internetopenurl);
there:InternetCloseHandle(internetopen);
}

在这里插入图片描述
在这里插入图片描述


http://chatgpt.dhexx.cn/article/xfm9aQCv.shtml

相关文章

juniper设备日常操作指南

1、日常show操作 # show 查看所有配置 # show | display set 查看set格式的所有配置 # show system | display set 查看set格式的system层级配置 # show system login | display set 查看set格式的system层级下的login层级配置# run show version # run show route 1.1.1.…

这几个juniper巡检命令超实用

1. CPU利用率核查 show chassis routing-engine2. MEM利用率核查 show chassis routing-engine3. OSPF邻居关系核查 show ospf neighbor4. LDP端口状态检查 show ldp interface5. ISIS邻居关系检查 show isis adjacency6. BGP邻居关系检查 show bgp neighbor7. HSRP信息检…

Juniper

Juniper Networks[编辑] Juniper Networks公司类型 上市&#xff08;NYSE&#xff1a;JNPR&#xff09;成立1996年2月代表人物执行长&#xff1a;Shaygan Kheradpir 技术长&#xff1a;Pradeep Sindhu 董事长&#xff1a;Scott Kriens总部地点 加州森尼韦尔&#xff08;Sunnyva…

Juniper入门之RIP

拓扑 配置 JUNOS-1 #配置接口 interfaces {em2 {unit 10 {family inet { address 12.1.1.1/24;}}}lo0 {unit 10 {family inet {address 1.1.1.1/32;}}} } protocols {rip {import import-policy;group rip-group {export export-policy;neighbor em2.10 {send …

Juniper Radius And Tacacs Server 认证测试

1. 简述 Juniper产品支持Radius、Tacacs及本地Password认证。根据不同的用户需求&#xff0c;3A服务器认证可能会结合域用户、LDAP、RSA-Token等认证服务器进行综合认证。此测试报告使用Juniper VSRX和Cisco ACS5.2验证3A相关认证选项。 2. 测试拓扑 使用Vmware workstation 9…

Juniper-SRX-基于域控认证的用户防火墙

目录 1&#xff1a;架构与环境说明 2&#xff1a;防火墙基础配置 3&#xff1a;Win-server部署 4&#xff1a;SRX-加域流量放行 5&#xff1a;Client相关域设置 6&#xff1a;Win-server联动SRX的相关设置 7&#xff1a;SRX-外部Server配置 8&#xff1a;SRX域控认证策略…

Juniper考试认证简单介绍

简单的对考试的介绍&说明&#xff1a; JUNIPER认证考试是分产品的&#xff0c;目前最完善的是M/T骨干路由器产品的考试&#xff1b; JNCIS&#xff0c;这个是笔试&#xff1b; JNCIP&#xff0c;实验室考试[1天]&#xff1b; JNCIE&#xff0c;实验室考试[1天]&#xff1b;…

Juniper认证介绍

转自&#xff1a;http://tech.ddvip.com/2008-06/121260544745173.html Juniper网络公司技术认证项目(JNTCP)由特定平台的多级系列课程组成。每套课程都允许学员通过笔试、实际配置及故障排除考试相结合的方式来证明自己在Juniper网络公司技术方面的能力。通过考试的考生可以证…

Juniper防火墙之图解用户认证

今天正好学习到Juniper防火墙中的用户认证&#xff0c;那么今天就带大家来看看Juniper防火墙的用户认证。 Juniper防火墙的用户分类&#xff1a; 1、Admin User&#xff1a;管理员用户 2、Auth User&#xff1a;认证用户 3、IKE User&#xff1a;IKE第一阶段用户的认证 4、XAut…

设计模式-观察者模式

观察者模式定义 观察者模式定义对象之间的一对多以来&#xff0c;这样以来&#xff0c;当一个对象改变状态时&#xff0c;它的所有依赖者都会收到通知并自动更新。 观察者模式理解 结合下面的观察者模式类图。 首先&#xff0c;我们要知道观察者就是那群等待被通知的人&…

vue -观察者模式

观察者模式 vue中的观察者模式什么是观察者模式案例 vue中的观察者模式 vue2 底成的原理是 object.defineproperty&#xff08;&#xff09; 配合观察者模式 object.defineproperty&#xff08;&#xff09;对数据可以进行劫持 当数据发生变化的时候 需要通知被依赖的地方 这时…

观察者模式(python)

一、模式定义 1.观察者模式(Observer Pattern)&#xff1a;定义对象间的一种一对多依赖关系&#xff0c;使得每当一个对象状态发生改变时&#xff0c;其相关依赖对象皆得到通知并被自动更新。 2.观察者模式又叫做发布-订阅&#xff08;Publish/Subscribe&#xff09;模式、模…

观察者模式(结合C#,Unity)

文章目录 前言概念简介观察者模式&#xff1f;发布-订阅模式&#xff1f; 观察者&#xff08;发布-订阅&#xff09;模式应用不用设计模式实现用接口实现观察者模式代码结构介绍实现发布-订阅模式 用事件实现改进接口法改进方式事件管理中心 前言 概念简介 先来看一段比较正式…

Android设计模式详解之观察者模式

前言 观察者常用于订阅-发布系统&#xff0c;能够将观察者和被观察者进行解耦&#xff0c;降低两者之间的依赖&#xff1b; 定义&#xff1a;定义对象间一种一对多的依赖关系&#xff0c;使得每当一个对象改变状态时&#xff0c;则所有依赖于它的对象都会得到通知并被自动更新…

PHP 观察者模式 理解

用模式开发的优点是&#xff0c;能让我们的逻辑结构以及代码更加清晰&#xff0c;便于维护&#xff01; 而我们为什么要用 “观察者模式”&#xff1f;这就需要从实际运用中来理解才能更好的运用&#xff01;用如下的情境来说明吧。 事例&#xff0c;开始时我被安排做项目的登…

C++设计模式——观察者模式

观察者模式&#xff08;Observer&#xff09; 观察者模式是目前应用最广、影响范围最大的模式之一&#xff0c;因为 Observer 的一个实例Model/View/Control&#xff08; MVC&#xff09; 结构在系统开发架构设计中有着很重要的地位和意义&#xff0c; MVC实现了业务逻辑和表示…

Vue观察者模式和发布订阅者模式

什么是观察者模式&#xff1f; 例如&#xff1a;抖音上的小杨哥&#xff0c;当小杨哥在抖音开启直播时&#xff0c;会自动通知所有的粉丝。 小杨哥&#xff1a;直播间开播了&#xff01; 小杨哥为目标 抖友为观察者 目标应该具备 收集观察者删除观察者通知观察者 <!DO…

c++之观察者模式

一&#xff0c;观察者模式 随着交通信号灯的变化&#xff0c;汽车的行为也随之而变化&#xff0c;一盏信号灯可以指挥多辆汽车。 观察者模式是用于建立一种对象与对象之间的依赖关系&#xff0c;一个对象发生改变时将自动通知其他对象&#xff0c; 其他对象将相应作出反应&…

springBoot 观察者模式

观察者设计模式 jie神说用订阅和发布来理解更好&#xff0c;我想了一下是的 为什么呢&#xff1f;因为监听器这个名词听起来是一个主动的&#xff0c;可实际监听器是一个被动的玩意 比如我们事件源发布一个事件&#xff0c;然后监听器订阅了这个事件就能做出动作。 里面涉及到…

设计模式之观察者模式

1. 观察者模式概述 我们不断提到软件系统解耦的重要性&#xff0c;当减少依赖关系时&#xff0c;我们可以扩展、开发和测试不同的模块&#xff0c;而无需了解其他模块的实现&#xff0c;只需要知道它们实现的抽象。尽管如此&#xff0c;在实践中&#xff0c;模块是需要协同工作…