观察者模式(行为模式)
观察者模式
观察者模式属于行为模式,个人理解:和发布订阅者魔模式是有区别的
细分有两种:推模式和拉模式两种,具体区别在于推模式会自带推送参数,拉模式是在接收通知后要自己获取更新参数
观察者模式(Observer Pattern)的使用场景主要围绕对象间一对多的依赖关系,当一个对象(被观察者)的状态变化需要自动通知其他多个对象(观察者)时,该模式能有效解耦代码。以下是典型的使用场景和案例:
应用场景
1. GUI 事件处理
场景:用户界面组件(如按钮、输入框)的状态变化需要触发多个事件监听器。
案例:
- 点击按钮后,触发日志记录、界面更新、数据提交等多个操作。
- 输入框内容变化时,实时校验输入合法性并更新提示信息。
框架应用:Java Swing、Android 的OnClickListener
、JavaScript 的addEventListener
。
2. 实时数据同步
场景:数据源的变更需要实时同步到多个客户端或组件。
案例:
-
股票行情系统:股价变动时,所有关注的投资者界面自动刷新。
-
在线协作工具(如 Google Docs):一个用户编辑内容,其他用户的视图实时更新。
-
前端框架(如 Vue、React)的数据绑定:数据变化驱动视图渲染。
-
一个主界面由好几个子界面垂直布局组成, 数据源的变更,子界面的数据将实时变化(页面由还几个一级标题页面,为了解耦和代码管理按照标题差分类结构)
3. 状态监控与报警
场景:监控系统状态变化,并触发相关响应(如日志、报警、资源调整)。
案例:
- 服务器 CPU 使用率超过阈值时,触发邮件报警、记录日志、自动扩容。
- 物联网设备(如传感器)数据异常时,通知用户和管理系统。
4. 游戏开发中的事件系统
场景:游戏内事件(如角色死亡、任务完成)需要触发多模块响应。
案例:
- 玩家生命值降为 0 时,触发 UI 更新死亡动画、保存进度、播放音效。
- 成就系统:当玩家达成特定条件(如击杀 100 个敌人),解锁成就并推送通知。
5. 配置或参数动态更新
场景:系统配置变更后,相关组件需动态调整行为,无需重启。
案例:
- 修改系统主题颜色,所有界面组件自动切换配色。
- 动态调整日志级别,实时生效。
6. 分布式系统中的一致性保证
场景:多个服务需要根据核心服务状态变化保持一致性。
案例:
- 电商系统中,订单状态变为“已支付”时,通知库存服务扣减库存、物流服务生成运单。
- 分布式缓存失效:当缓存数据更新,通知所有节点清除旧缓存。
观察者模式的优势
- 解耦:被观察者与观察者之间松耦合,可独立扩展。
- 灵活性:动态添加/移除观察者,符合开闭原则。
- 一致性:确保所有依赖对象在状态变化时同步更新。
注意事项
- 性能问题:观察者过多或通知逻辑复杂时,可能影响性能。
- 循环依赖:避免观察者间相互触发导致死循环。
- 内存泄漏:某些语言(如 Java)需手动注销观察者,防止对象无法回收。
何时选择观察者模式?
- 一个对象的变化需要通知其他对象,且具体通知对象未知或可变。
- 需要减少对象间的直接依赖,提升代码复用性和可维护性。
- 跨层级或跨模块通信,尤其是事件驱动的系统架构。
推模式代码
#include <iostream>
#include <vector>
#include <memory>// 观察者接口
class Observer {
public:virtual void update(float temperature, float humidity) = 0; // 推送具体数据virtual ~Observer() = default;
};// 被观察者(气象站)
class WeatherStation {
private:std::vector<Observer*> observers;float temperature;float humidity;public:void addObserver(Observer* observer) {observers.push_back(observer);}void removeObserver(Observer* observer) {// 实际代码中需要更安全的删除逻辑observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());}void setMeasurements(float temp, float hum) {temperature = temp;humidity = hum;notifyObservers();}private:void notifyObservers() {for (auto observer : observers) {observer->update(temperature, humidity); // 推送数据}}
};// 具体观察者(显示屏)
class Display : public Observer {
public:void update(float temperature, float humidity) override {std::cout << "显示屏更新 - 温度: " << temperature << "°C, 湿度: " << humidity << "%\n";}
};int main() {WeatherStation station;Display display;station.addObserver(&display);station.setMeasurements(25.5f, 60.0f); // 数据变化时自动推送return 0;
}
拉模式代码
#include <iostream>
#include <vector>
#include <memory>// 观察者接口
class Observer {
public:virtual void update() = 0; // 不推送数据,观察者自行拉取virtual ~Observer() = default;
};// 被观察者(气象站)
class WeatherStation {
private:std::vector<Observer*> observers;float temperature;float humidity;public:void addObserver(Observer* observer) {observers.push_back(observer);}void removeObserver(Observer* observer) {observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());}void setMeasurements(float temp, float hum) {temperature = temp;humidity = hum;notifyObservers();}// 观察者通过接口拉取数据float getTemperature() const { return temperature; }float getHumidity() const { return humidity; }private:void notifyObservers() {for (auto observer : observers) {observer->update(); // 仅通知,不传递数据}}
};// 具体观察者(显示屏)
class Display : public Observer {
private:WeatherStation& station; // 观察者持有被观察者的引用以拉取数据public:Display(WeatherStation& station) : station(station) {}void update() override {float temp = station.getTemperature();float hum = station.getHumidity();std::cout << "显示屏更新 - 温度: " << temp << "°C, 湿度: " << hum << "%\n";}
};int main() {WeatherStation station;Display display(station); // 观察者需要持有被观察者的引用station.addObserver(&display);station.setMeasurements(25.5f, 60.0f); // 数据变化时通知观察者return 0;
}
和发布订阅者模式的区别:
观察者模式(Observer Pattern)和发布-订阅模式(Pub-Sub Pattern)是两种常用于解耦对象间通信的设计模式,但它们的设计思想和应用场景有显著区别。以下是两者的核心差异和对比:
1. 核心机制与角色关系
特性 | 观察者模式 | 发布-订阅模式 |
---|---|---|
通信方式 | 直接通信:被观察者(Subject)直接通知观察者(Observer)。 | 间接通信:发布者(Publisher)和订阅者(Subscriber)通过**中介层(Broker/Event Bus)**交互。 |
角色关系 | - 被观察者(Subject) - 观察者(Observer) | - 发布者(Publisher) - 订阅者(Subscriber) - 中介层(Broker) |
耦合度 | 较高:观察者需要直接注册到被观察者,依赖其接口。 | 极低:发布者和订阅者彼此无感知,仅依赖中介层和事件类型。 |
事件路由 | 被观察者自行管理观察者列表,并决定通知逻辑。 | 中介层负责事件的路由、过滤和广播(例如按主题、标签或内容匹配)。 |
2. 典型代码结构对比
(1) 观察者模式
// 被观察者(Subject)
class WeatherStation {
private:std::vector<Observer*> observers;
public:void addObserver(Observer* observer) { /*注册观察者*/ }void notifyObservers() {for (auto obs : observers) {obs->update(temperature); // 直接调用观察者的接口}}
};// 观察者(Observer)
class Display : public Observer {
public:void update(float temp) override { /*更新显示*/ }
};
(2) 发布-订阅模式
// 中介层(Broker)
class MessageBroker {
private:std::unordered_map<std::string, std::vector<Subscriber*>> topicSubscribers;
public:void subscribe(const std::string& topic, Subscriber* sub) { /*按主题订阅*/ }void publish(const std::string& topic, const std::string& message) {for (auto sub : topicSubscribers[topic]) {sub->onMessage(message); // 通过中介层转发消息}}
};// 订阅者(Subscriber)
class User : public Subscriber {
public:void onMessage(const std::string& msg) override { /*处理消息*/ }
};
3. 关键区别
维度 | 观察者模式 | 发布-订阅模式 |
---|---|---|
通信方向 | 单向:被观察者 → 观察者 | 多向:发布者 → 中介层 → 订阅者(支持多对多通信) |
动态性 | 观察者需显式注册到具体被观察者 | 订阅者通过中介层动态订阅事件类型(如主题、频道) |
扩展性 | 新增事件类型需修改被观察者接口 | 新增事件类型只需在中介层注册,无需修改发布者或订阅者 |
适用场景 | 对象间一对多的简单依赖关系(如GUI事件、状态同步) | 复杂的多对多通信、跨系统解耦(如微服务、消息队列) |
典型应用 | - 按钮点击事件监听 - 数据模型更新UI | - 新闻订阅系统 - 分布式系统的异步通信 - 实时聊天室 |
4. 场景示例
(1) 观察者模式适用场景
-
GUI事件处理:
按钮(被观察者)被点击时,直接通知所有注册的监听器(观察者)执行操作。button.addClickListener(&logListener); // 日志监听器 button.addClickListener(&uiUpdater); // 界面更新监听器
-
游戏状态同步:
角色血量变化时,通知UI组件、音效模块、成就系统更新。
(2) 发布-订阅模式适用场景
-
新闻订阅系统:
用户(订阅者)订阅“科技”主题,发布者发布新闻时,中介层将消息推送给所有订阅者。broker.subscribe("科技", &user1); // 用户订阅主题 broker.publish("科技", "AI新突破!"); // 发布者发送消息
-
微服务通信:
订单服务(发布者)发布“订单创建”事件,库存服务(订阅者)接收事件并扣减库存。
5. 总结:何时选择哪种模式?
模式 | 选择条件 |
---|---|
观察者模式 | - 对象间关系简单(一对多) - 需要直接控制通知逻辑 - 实时性要求高 |
发布-订阅模式 | - 系统需要解耦(多对多) - 动态事件类型和订阅关系 - 跨组件或跨系统通信 |
6. 常见误区
-
误区1:发布-订阅是观察者模式的“升级版”。
纠正:两者解决不同问题。观察者模式强调直接通信,发布-订阅强调间接通信和解耦。 -
误区2:中介层(如
TalkNotifier
)的存在即表示发布-订阅模式。
纠正:观察者模式中的Subject
也可以视为简单中介,但发布-订阅的中介层更独立且支持复杂路由。 -
误区3:发布-订阅必须异步。
纠正:发布-订阅可以实现为同步或异步,而观察者模式通常是同步的。
相关文章:
观察者模式(行为模式)
观察者模式 观察者模式属于行为模式,个人理解:和发布订阅者魔模式是有区别的 细分有两种:推模式和拉模式两种,具体区别在于推模式会自带推送参数,拉模式是在接收通知后要自己获取更新参数 观察者模式(Obs…...
Spark SQL
Spark SQL Spark SQL 是 Spark 用于结构化数据(structured data)处理的 Spark 模块。 Spark SQL特点 易整合。无缝的整合了 SQL 查询和 Spark 编程 统一的数据访问。使用相同的方式连接不同的数据源 兼容 Hive。在已有的仓库上直接运行 SQL 或者 HQL 标准数据连接。通过 JDBC…...
周末学习笔记:Python文件操作(结构化数据转换与文件处理)
目录 一、任务目标 二、实现步骤与代码解析 2.1 数据准备阶段 关键点解析: 2.2 数据转换核心代码 三、关键技术解析 3.1 字符串处理方法 3.2 数据结构转换 3.3 文件写入技巧 四、执行结果验证 输入文件t1.txt内容: 输出文件t2.txt内容&am…...
【PCIE736-0】基于 PCIE X16 总线架构的 4 路 QSFP28 100G 光纤通道处理平台
产品概述 PCIE736-0 是一款基于 PCIE 总线架构的 4 路 QSFP28 100G 光纤通道适配器,该板卡具有 1 个 PCIe Gen3x16 主机接口、一共 4个 QSFP28 100G 光纤接口,可以实现 4 路 QSFP28 100G 光纤的数据实时采集、实时缓存与 PCIE 高速传输。该板卡采用 Xil…...
PyCharm 开发工具 修改背景颜色
PyCharm 开发工具 修改背景颜色 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是Python基础语法。前后每一小节的内容是有学习/理解关联性,希望对您有用~ PyCharm 开发工具 修改背景颜色 文章目录 PyCharm 开…...
linux Shell编程之循环语句(三)
目录 一. for 循环语句 1. for语句的结构 2. for 语句应用示例 (1) 根据姓名列表批量添加用户 (2) 根据 IP 地址列表检查主机状态 二. 使用 while 循环语句 1. while 语句的结构 2. while 语句应用示例 (1) 批量添加规律编号的用户 (2) 猜价格游戏 三. until 循环语…...
GCC和GDB基础知识
1 GCC和G 一套开源的编译器,支持 C、C、Fortran 等语言。它负责将人类编写的源代码(如 .c 文件)翻译成计算机能执行的二进制文件(如 .exe)。 核心作用: 预处理:处理宏…...
网络复习二(TCP【3】)
一、为什么TIME_WAIT等待的时间是2MSL? MSL:报文最大生存时间 我们要知道TCP报文是基于IP协议生存的,而在IP头中有一个TTL(经过路由跳数),当TTL为0使,数据报被丢失,同时发送ICMP报…...
【5G通信】通过RRC重配实现功率调整的可能性
在5G网络中,通过解析UE Capability Information消息中的RF Parameters字段实现终端发射功率的动态调整,需要结合协议规范、射频特性及网络控制策略。以下是技术实现流程及示例: 一、RF Parameters关键字段解析 根据3GPP TS 38.331和TS 38.10…...
UE 使用事件分发器设计程序
【双字精译】虚幻引擎中的设计模式:观察者模式——Ali Elzoheiry|游戏开发游戏编程模式游戏设计模式虚幻蓝图编程事件分发器UnrealEngineUE5_哔哩哔哩_bilibili 创建一个事件分发器,这里是放在死亡事件里 比如计算场景中的敌人数量,这个UI是…...
前端面试宝典---原型链
引言----感谢大佬的讲解 大佬链接 原型链示意图 原型链问题中需要记住一句话:一切变量和函数都可以并且只能通过__proto__去找它所在原型链上的属性与方法 原型链需要注意的点 看上图可以发现 函数(构造函数)也可以通过__proto__去找到原…...
ViT 模型讲解
文章目录 一、模型的诞生背景1.1 背景1.2 ViT 的提出(2020年) 二、模型架构2.1 patch2.2 模型结构2.2.1 数据 shape 变化2.2.2 代码示例2.2.3 模型结构图 2.3 关于空间信息 三、实验3.1 主要实验3.2 消融实验 四、先验问题4.1 归纳偏置4.2 先验or大数据&…...
【技术文章的标准结构与内容指南】
技术文章的标准结构与内容指南 技术文章是传递专业知识、分享实践经验的重要媒介。一篇高质量的技术文章不仅能够帮助读者解决问题,还能促进技术交流与创新。以下是技术文章通常包含的核心内容与结构指南。 1. 标题 一个好的技术文章标题应当: 简洁明…...
Mysql概述
一、数据库相关概念 1.数据库(Data Base ,简称DB)是长期存储在计算机中有组织、可管理、可共享的数据集合。 2.数据库管理系统(Database Management System,简称为 DBMS)是管理数据库的系统软件 3.MySQL数据库全称为MySQL数据库管理系统 3.SQL语言(S…...
系统设计模块之安全架构设计(身份认证与授权(OAuth2.0、JWT、RBAC/ABAC))
一、OAuth 2.0:开放授权框架 OAuth 2.0 是一种标准化的授权协议,允许第三方应用在用户授权下访问其资源,而无需直接暴露用户密码。其核心目标是 分离身份验证与授权,提升安全性与灵活性。 1. 核心概念与流程 角色划分ÿ…...
如何管理“灰色时间”导致的成本漏洞
明确时间记录机制、优化流程透明度、应用自动化工具、强化绩效考核机制、提高员工时间意识 来有效管理。其中,明确时间记录机制 是最关键的一步。通过统一的时间记录平台,例如Toggl Track、Clockify或企业级工时系统,不仅可以实时掌握员工工作…...
程序化广告行业(84/89):4A广告代理公司与行业资质解读
程序化广告行业(84/89):4A广告代理公司与行业资质解读 大家好!在探索程序化广告行业的道路上,每一次知识的分享都是我们共同进步的阶梯。一直以来,我都希望能和大家携手前行,深入了解这个充满机…...
MTK Android12-13 -Intent Filter Verification Service 停止运行
MTK Android12-13 -Intent Filter Verification Service 停止运行 问题修复 文章目录 参考资料解决方案-修改文件源码分析源码 StatementService配置加载config_appsNotReportingCrashesActivityManagerService -retrieveSettings 加载配置AppErrors-loadAppsNotReportingCrash…...
Sentinel源码—1.使用演示和简介二
大纲 1.Sentinel流量治理框架简介 2.Sentinel源码编译及Demo演示 3.Dashboard功能介绍 4.流控规则使用演示 5.熔断规则使用演示 6.热点规则使用演示 7.授权规则使用演示 8.系统规则使用演示 9.集群流控使用演示 5.熔断规则使用演示 (1)案例说明熔断和降级 (2)Sentin…...
基于Geotools的PostGIS原始操作之CQL过滤及按属性名称生成面属性时间-以湖北省地级市行政区划为例
目录 前言 背景与意义 技术方法概述 一、CQL查询实现 1、CQL查询原理 2、Geotools中的CQL实现 二、SLD编程式样式生成 1、获取唯一的分类值 2、生成不同颜色分类 3、集成生成SLD的Style文件 三、总结 前言 随着地理信息系统(GIS)技术的快速发展…...
Linux内核中struct net_protocol的early_demux字段解析
背景问题 在内核版本4.19.0-25的头文件中,struct net_protocol结构体的定义未显式包含early_demux字段。然而,在内核版本4.19的源代码中可以看到tcp_protocol实例化时却对该字段进行了赋值: static struct net_protocol tcp_protocol = {.early_demux = tcp_v4_earl…...
TLS协议四次握手原理详解,密钥套件采用DH密钥交换算法
目录 1.TLS协议握手概述 2.TLS协议握手具体步骤 2.1.TLS第一次握手 2.2.TLS第二次握手 2.3.TLS第三次握手 2.4.TLS第四次握手 3.DH密钥交换算法 1.TLS协议握手概述 第一步客户端会发起一个消息,携带了TLS的版本号,客户端随机数,密码套…...
React 更新state中的对象
更新 state 中的对象 state 中可以保存任意类型的 JavaScript 值,包括对象。但是,你不应该直接修改存放在 React state 中的对象。相反,当你想要更新一个对象时,你需要创建一个新的对象(或者将其拷贝一份)…...
祁连山国家公园shp格式数据
地理位置:祁连山国家公园位于中国西北部,横跨甘肃省与青海省交界处,主体处于青藏高原东北边缘。总面积约5.02万平方公里,是中国首批设立的10个国家公园之一。 设立背景 试点启动:2017年,祁连山国家公园体制…...
电梯设备与电源滤波器:现代建筑中的安全守护者与电力净化师
在现代都市的钢铁森林中,电梯作为垂直交通的动脉,承载着无数人的日常出行。与此同时,在电气系统的隐秘角落,电源滤波器则默默扮演着“电力净化师”的角色,保障着各类电子设备的稳定运行。电梯设备与电源滤波器…...
Qt样式表(窗口、按钮之类,有图片和代码详细注释)
Qt样式表 1、前言2、QWdiget窗口添加背景图片2.1使用Frame解决 3、主题1(黑色背景发光边框冷色调)3.1 QWidget3.2 QPushButton3.3QLineEdit3.4 QTextEdit 4、主题二(极简冰川蓝)4.1QWidget4.2 QLineEdit4.3QTextEdit4.4QPushButto…...
在Ubuntu下进行单片机开发是否需要关闭Secure Boot
1. Secure Boot的作用 功能:Secure Boot是UEFI的安全功能,旨在阻止未经验证的驱动或操作系统启动,防止恶意软件篡改引导过程。 影响范围:它主要限制的是操作系统启动阶段加载的内核级驱动(如显卡驱动、虚拟化模块&…...
【Python爬虫】简单案例介绍4
本文继续接着我的上一篇博客【Python爬虫】简单案例介绍3-CSDN博客 目录 3.4 完整代码 3.4 完整代码 此小节给出上述案例的完整代码, # encodingutf-8 import re, json, requests, xlwt, csv import pandas as pd from lxml import etree from bs4 import Beauti…...
农民剧团的春天与改变之路
杨天义,男,1966年9月生,中共党员,江西省吉安市吉水县水南农民剧团团长。 杨天义从废品收购起家,凭借自身的努力和奋斗,自筹资金100余万元建设了水南镇的第一座影剧院,组建了江西省吉安市吉水县…...
网页防篡改与盗链防护:实时监控与自动化修复实践
摘要:针对网页内容篡改与盗链问题,本文基于群联AI云防护系统,详解如何通过哈希校验、实时监控与CDN联动实现秒级修复,并提供Python与AWS S3集成代码。 一、网页安全的核心需求 防篡改:保障页面内容完整性,…...
【密码学——基础理论与应用】李子臣编著 第五章 序列密码 课后习题
免责声明 这里都是自己搓或者手写的。 里面不少题目感觉有问题或者我的理解有偏颇,请大佬批评指正! 不带思考抄作业的请自动退出,我的并非全对,仅仅提供思维! 题目 逐题解析 5.1 我们先要知道三阶LFSR函数的表达式…...
【uni-app】页面跳转传参
一、EventChannel 的核心作用 替代全局事件总线 相比传统的 uni.$emit 和 uni.$on,EventChannel 无需手动移除监听(如 uni.$off),避免内存泄漏风险。解决 URL 传参限制 当需要传递大量数据时,URL 拼接参数可能超出长度…...
【MySQL】表的增删改查
前言 前面我们对表结构做了介绍,本期我们对表的内容操作机增删改查进行介绍! 目录 前言 一、insert 插入 1.1 单行数据 全列插入 1.2 多行数据 指定列插入 1.3 插入否则更新 1.4 插入否则替换 二、select 查询 2.1 select 列 2.1.1 全列查询…...
AQchat
在当前项目里,Handler 类主要用于处理不同类型的命令或者消息,下面按照不同功能模块为你详细介绍各 Handler 的作用。 命令处理 Handler(位于 com.howcode.aqchat.handler.impl 包) SyncRoomMembersCmdHandler:处理同…...
Profibus DP转ModbusTCP网关通讯案例解析
Profibus DP转ModbusTCP网关通讯案例解析 Profibus DP和Modbus TCP都是工业自动化领域中常见的通信协议,各自在不同的应用场景中发挥着重要作用。然而,由于不同设备、系统之间的兼容性需求,常常需要进行这两种协议的转换。本文将介绍一个典型…...
将你的 Rust + WebAssembly 项目发布到 npm
一、准备工作:登录 npm 在发布之前,你需要: 拥有一个 npm 账号 没有的话可前往 https://www.npmjs.com/signup 免费注册。 登录本地 npm 账户 使用 wasm-pack 自带的登录命令: wasm-pack login它会提示你输入 npm token…...
RGBD惯性SLAM
介绍 本篇介绍一种基于视觉光流法的RGBD惯性SLAM算法,该算法的前身是DEMO算法。 相对于原始版本: 更新了相对较老的IplImage 相关接口 加入了GTSAM后端;滑动窗口后端;3D-3Dbatch优化;点到面batch后端。分别对应不同的…...
linuxbash原理
3417 1647 0 04:17 ? 00:00:21 /usr/libexec/gnome-terminal-server yangang 3425 3417 0 04:17 pts/0 00:00:00 bash yangang 4524 3417 0 04:26 pts/1 00:00:00 bash 控制台创建是通过/usr/libexec/gnome-terminal-server 进行创建 rea…...
ctfshow做题笔记—栈溢出—pwn75~pwn79
目录 前言 一、pwn75(栈空间不够怎么办?) 二、pwn76 三、pwn77(Ez ROP or Mid ROP ?) 四、pwn79(你需要注意某些函数,这是解题的关键!) 前言 嘿嘿,隔了一段时间没有做pwn题了(主播脱单了)࿰…...
C++ 标准库中的 <algorithm> 头文件算法总结
C 常用 <algorithm> 算法概览 C 标准库中的 <algorithm> 头文件提供了大量有用的算法,主要用于操作容器(如 vector, list, array 等)。这些算法通常通过迭代器来操作容器元素。 1. 非修改序列操作 std::all_of, std::any_of, s…...
leecode Hot100之回溯算法【C++速查】
文章目录 [46. 全排列](https://leetcode.cn/problems/permutations/)[78. 子集](https://leetcode.cn/problems/subsets/)[17. 电话号码的字母组合](https://leetcode.cn/problems/letter-combinations-of-a-phone-number/)[39. 组合总和](https://leetcode.cn/problems/combi…...
前端 main.js能做哪些事?
前端 main.js 的从入门到进阶 摘要 在前端开发中,main.js 文件是项目启动的关键入口,它承担着初始化应用、引入依赖、配置全局设置等重要职责。本文将全面介绍 main.js 的基础知识,包括其基本结构和作用,并深入探讨如何进行进阶开…...
JAVA Web_定义Servlet2_学生登录验证Servlet
题目 页面StudentLogin.html中有一HTML的表单代码如下: <form action"studentLogin" method"post">学生姓名:<input type"text" name"stuName" value""><br>登录密码:…...
【信息系统项目管理师】高分论文:论信息系统项目的范围管理(电网公司保供电可视化系统)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文1、规划范围管理2、收集需求3、定义范围4、创建工作分解结构(WBS)5、确认范围6、控制范围论文 2017年5月,我作为项目经理参加XX省电网公司保供电可视化系统应用项目的建设,该项目是2017年XX省电网信息化…...
如何高效查询订单销售情况与售罄率:从SQL到架构优化的全流程设计
在电商平台、SaaS多租户系统中,订单数据作为核心数据之一,承载了关键的运营指标,如销售额、商品售罄率、订单转化等。随着数据量的持续增长,如何在大数据量条件下快速、稳定地获取统计信息,成为系统设计的重点之一。 本文将从查询目标分析入手,结合数据库设计优化与典型…...
RTT添加一个RTC时钟驱动,以DS1307为例
添加一个外部时钟芯片 这里多了一个选项 复制drv_rtc.c,重命名为drv_rtc_ds1307.c 添加到工程中 /*** @file drv_rtc_ds1307.c* @brief * @author jiache (wanghuan3037@fiberhome.com)* @version 1.0* @date 2025-01-08* * @copyright Copyright (c) 2025 58* */ #...
Leetcode 独一无二的出现次数
可以通过哈希集来判断是否独一无二,如果set中已经包含了count,那么set.add(count)会返回false class Solution {public boolean uniqueOccurrences(int[] arr) {Map<Integer, Integer> map new HashMap<>();for(int i 0; i < arr.leng…...
ubuntu上,e1000e,i1210有线网卡驱动安装
1,下载附属资源,解压对应的压缩包 tar zxf e1000e-<x.x.x>.tar.gz 2,进入压缩包src目录下 cd e1000e-<x.x.x>/src/ 3,安装 sudo make install 4,重启 reboot e1000e Intel官网下载地址 https://www.i…...
Xmind 2025 中文思维导图
Xmind 2025 中文思维导图 一、介绍 Xmind ,是一款出色的思维导图和头脑风暴软件,拥有美观的智能配色方案,便于你轻松理清思路捕捉创意。丰富的导图模板及多种创意整合工具,可助力导图迸发更多活力。还拥有强大演说模式ÿ…...
搭载DeepSeek|暴雨AI教育一体机加速AI教育普及
近日,在全国智算大会上,暴雨公司展示了新一代 AI 教育一体机,通过全栈国产化技术与 DeepSeek 模型的深度适配,打造低成本、高性能的人工智能教育解决方案,助力 AI 教育普及与教育数字化转型。 暴雨AI教育一体机&#…...