【C++】八大常见的设计模式的实现与实践指南
目录
- 创建型模式
- 单例模式
- 工厂方法模式
- 抽象工厂模式
- 结构型模式
- 适配器模式
- 装饰者模式
- 代理模式
- 行为型模式
- 观察者模式
- 策略模式
- 命令模式
- 高级主题
- 现代C++特性影响
- 模式性能对比
- 典型应用案例
设计模式分类
一、创建型模式
1. 单例模式(Singleton)
现代C++17线程安全实现
#include <mutex>
#include <memory>class ConfigManager {
private:static std::unique_ptr<ConfigManager> instance;static std::once_flag initFlag;// 私有构造函数ConfigManager() { loadConfig(); }void loadConfig() { /* 加载配置文件 */ }public:// 删除拷贝操作ConfigManager(const ConfigManager&) = delete;ConfigManager& operator=(const ConfigManager&) = delete;static ConfigManager& getInstance() {std::call_once(initFlag, [](){instance.reset(new ConfigManager);});return *instance;}std::string getValue(const std::string& key) { /* 返回配置值 */ return "";}
};// 初始化静态成员
std::unique_ptr<ConfigManager> ConfigManager::instance;
std::once_flag ConfigManager::initFlag;
应用陷阱
- 测试困难:全局状态影响单元测试
- 生命周期管理:依赖顺序问题
- 多线程初始化竞争
2. 工厂方法模式(Factory Method)
现代实现(使用lambda工厂)
#include <functional>
#include <map>class Button {
public:virtual void render() = 0;virtual ~Button() = default;
};class WindowsButton : public Button {
public:void render() override { /* Windows风格渲染 */ }
};class MacButton : public Button {
public:void render() override { /* Mac风格渲染 */ }
};class GUIFactory {
private:using FactoryFunc = std::function<std::unique_ptr<Button>()>;std::map<std::string, FactoryFunc> factories;public:void registerFactory(const std::string& type, FactoryFunc factory) {factories[type] = factory;}std::unique_ptr<Button> createButton(const std::string& type) {if (auto it = factories.find(type); it != factories.end())return it->second();throw std::runtime_error("Unknown button type");}
};// 使用示例
GUIFactory factory;
factory.registerFactory("Windows", []{ return std::make_unique<WindowsButton>(); });
factory.registerFactory("Mac", []{ return std::make_unique<MacButton>(); });auto btn = factory.createButton("Windows");
btn->render();
二、结构型模式
3. 适配器模式(Adapter)
对象适配器实现
// 遗留圆形接口
class LegacyCircle {
public:void draw(int x, int y, int radius) {// 绘制圆形实现}
};// 新系统需要的形状接口
class Shape {
public:virtual void draw(float x, float y, float size) = 0;virtual ~Shape() = default;
};class CircleAdapter : public Shape {LegacyCircle legacyCircle;
public:void draw(float x, float y, float size) override {// 转换参数并调用遗留接口legacyCircle.draw(static_cast<int>(x), static_cast<int>(y),static_cast<int>(size/2));}
};
4. 装饰者模式(Decorator)
流处理装饰器
#include <iostream>
#include <memory>class DataStream {
public:virtual void write(const std::string& data) = 0;virtual ~DataStream() = default;
};class FileStream : public DataStream {
public:void write(const std::string& data) override {std::cout << "Writing to file: " << data << "\n";}
};class StreamDecorator : public DataStream {
protected:std::unique_ptr<DataStream> wrapped;
public:StreamDecorator(std::unique_ptr<DataStream> stream): wrapped(std::move(stream)) {}
};class CompressionDecorator : public StreamDecorator {
public:using StreamDecorator::StreamDecorator;void write(const std::string& data) override {auto compressed = compress(data);wrapped->write(compressed);}private:std::string compress(const std::string& data) {return "COMPRESSED[" + data + "]";}
};// 使用组合
auto stream = std::make_unique<CompressionDecorator>(std::make_unique<FileStream>()
);
stream->write("Sample Data");
二、结构型模式(续)
5. 代理模式(Proxy)
定义:为其他对象提供一种代理以控制对这个对象的访问
应用场景:
- 延迟初始化(虚拟代理)
- 访问控制(保护代理)
- 本地执行远程服务(远程代理)
- 日志记录(日志代理)
现代C++实现(延迟加载代理):
class Image {
public:virtual void display() = 0;virtual ~Image() = default;
};class HighResImage : public Image {std::string filename;
public:HighResImage(const std::string& file) : filename(file) {loadFromDisk();}void display() override {std::cout << "Displaying " << filename << "\n";}private:void loadFromDisk() {std::cout << "Loading " << filename << " from disk...\n";}
};class ImageProxy : public Image {std::unique_ptr<HighResImage> realImage;std::string filename;
public:ImageProxy(const std::string& file) : filename(file) {}void display() override {if (!realImage) {realImage = std::make_unique<HighResImage>(filename);}realImage->display();}
};// 使用示例
std::vector<std::unique_ptr<Image>> images;
images.push_back(std::make_unique<ImageProxy>("photo1.jpg"));
images.push_back(std::make_unique<ImageProxy>("photo2.jpg"));// 只有在实际显示时才加载图片
images[0]->display(); // 输出加载信息
images[0]->display(); // 直接显示,不再加载
三、行为型模式
6. 观察者模式(Observer)(续)
现代C++改进(类型安全实现):
#include <vector>
#include <functional>
#include <memory>template <typename... Args>
class Observable {using Observer = std::function<void(Args...)>;std::vector<std::weak_ptr<Observer>> observers;public:auto registerObserver(Observer callback) {auto shared = std::make_shared<Observer>(std::move(callback));observers.emplace_back(shared);return shared;}void notify(Args... args) {auto it = observers.begin();while (it != observers.end()) {if (auto observer = it->lock()) {(*observer)(args...);++it;} else {it = observers.erase(it);}}}
};// 使用示例
class Sensor {
public:Observable<float> temperatureChanged;void updateTemperature(float temp) {currentTemp = temp;temperatureChanged.notify(temp);}private:float currentTemp;
};int main() {Sensor sensor;auto observer = sensor.temperatureChanged.registerObserver([](float temp) {std::cout << "Temperature updated: " << temp << "°C\n";});sensor.updateTemperature(23.5f);sensor.updateTemperature(24.1f);
}
7. 策略模式(Strategy)
定义:定义算法族,分别封装,使它们可以互相替换
现代C++实现(使用std::function):
#include <functional>
#include <vector>class SortStrategy {
public:virtual void sort(std::vector<int>& data) = 0;virtual ~SortStrategy() = default;
};// 传统实现方式
class BubbleSort : public SortStrategy {
public:void sort(std::vector<int>& data) override {// 实现冒泡排序}
};// 现代C++风格实现
using ModernSortStrategy = std::function<void(std::vector<int>&)>;class SortContext {
public:// 传统策略方式void setStrategy(std::unique_ptr<SortStrategy> strategy) {this->strategy = std::move(strategy);}// 现代策略方式void setModernStrategy(ModernSortStrategy strategy) {modernStrategy = std::move(strategy);}void executeSort(std::vector<int>& data) {if (modernStrategy) {modernStrategy(data);} else if (strategy) {strategy->sort(data);}}private:std::unique_ptr<SortStrategy> strategy;ModernSortStrategy modernStrategy;
};// 使用示例
int main() {std::vector<int> data = {5, 2, 7, 1, 9};// 传统方式SortContext context1;context1.setStrategy(std::make_unique<BubbleSort>());context1.executeSort(data);// 现代方式SortContext context2;context2.setModernStrategy([](std::vector<int>& data) {// 实现快速排序std::sort(data.begin(), data.end());});context2.executeSort(data);
}
8. 命令模式(Command)
定义:将请求封装为对象,支持撤销操作
完整实现(含撤销功能):
#include <vector>
#include <memory>
#include <stack>class Document {std::string content;
public:void addText(const std::string& text) {content += text;}void deleteText(size_t length) {if (length >= content.size()) {content.clear();} else {content.erase(content.size() - length);}}std::string getContent() const { return content; }
};class Command {
public:virtual void execute() = 0;virtual void undo() = 0;virtual ~Command() = default;
};class AddTextCommand : public Command {Document& doc;std::string addedText;
public:AddTextCommand(Document& d, std::string text): doc(d), addedText(std::move(text)) {}void execute() override {doc.addText(addedText);}void undo() override {doc.deleteText(addedText.size());}
};class CommandHistory {std::stack<std::unique_ptr<Command>> history;
public:void push(std::unique_ptr<Command> cmd) {cmd->execute();history.push(std::move(cmd));}void undo() {if (!history.empty()) {history.top()->undo();history.pop();}}
};// 使用示例
int main() {Document doc;CommandHistory history;history.push(std::make_unique<AddTextCommand>(doc, "Hello "));history.push(std::make_unique<AddTextCommand>(doc, "World!"));std::cout << doc.getContent() << "\n"; // 输出:Hello World!history.undo();std::cout << doc.getContent() << "\n"; // 输出:Hello history.undo();std::cout << doc.getContent() << "\n"; // 输出:(空)
}
四、高级主题
1. 现代C++特性对设计模式的重构
1.1 Lambda表达式与策略模式融合
class PaymentProcessor {
public:using PaymentStrategy = std::function<bool(float)>;void setStrategy(PaymentStrategy strategy) {currentStrategy = std::move(strategy);}bool processPayment(float amount) {if(currentStrategy) {return currentStrategy(amount);}throw std::runtime_error("No payment strategy set");}private:PaymentStrategy currentStrategy;
};// 使用示例
PaymentProcessor processor;
processor.setStrategy([](float amount) -> bool {// 信用卡支付实现return true;
});processor.processPayment(99.99f);
1.2 可变参数模板实现通用装饰者
template <typename Component>
class LoggerDecorator {Component wrapped;
public:LoggerDecorator(Component&& comp) : wrapped(std::forward<Component>(comp)) {}template <typename... Args>auto operator()(Args&&... args) {std::cout << "Calling function with args: " << sizeof...(args) << "\n";auto result = wrapped(std::forward<Args>(args)...);std::cout << "Return value: " << result << "\n";return result;}
};// 用法示例
auto decoratedFunc = LoggerDecorator([](int x, int y) { return x + y; });
decoratedFunc(3, 4); // 输出调用日志和结果
2. 设计模式性能对比分析
2.1 虚函数调用开销测试
#include <chrono>// 传统策略模式实现
class TraditionalStrategy {
public:virtual int compute(int x) = 0;virtual ~TraditionalStrategy() = default;
};// 现代策略实现
using ModernStrategy = std::function<int(int)>;// 性能测试函数
template <typename Strategy>
void runBenchmark(Strategy&& strategy) {constexpr int iterations = 1'000'000;auto start = std::chrono::high_resolution_clock::now();int sum = 0;for(int i = 0; i < iterations; ++i) {sum += strategy(i);}auto duration = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::high_resolution_clock::now() - start);std::cout << "Time: " << duration.count() << "μs\n";
}// 测试用例
struct AddStrategy : TraditionalStrategy {int compute(int x) override { return x + 1; }
};int main() {// 传统虚函数调用AddStrategy traditional;runBenchmark([&](int x) { return traditional.compute(x); });// 现代std::functionModernStrategy modern = [](int x) { return x + 1; };runBenchmark(modern);// 直接lambda调用runBenchmark([](int x) { return x + 1; });
}
典型结果:
- 传统虚函数调用:约850μs
- std::function调用:约780μs
- 直接lambda调用:约650μs
3. 设计模式在游戏引擎中的实践
3.1 组件模式实现游戏对象系统
class GameObject {std::unordered_map<std::type_index, std::unique_ptr<Component>> components;public:template <typename T, typename... Args>T& addComponent(Args&&... args) {auto ptr = std::make_unique<T>(std::forward<Args>(args)...);auto& ref = *ptr;components[typeid(T)] = std::move(ptr);return ref;}template <typename T>T* getComponent() {auto it = components.find(typeid(T));return (it != components.end()) ? static_cast<T*>(it->second.get()) : nullptr;}void update() {for(auto& [_, comp] : components) {comp->update();}}
};class Component {
public:virtual void update() = 0;virtual ~Component() = default;
};// 具体组件实现
class Transform : public Component {
public:void update() override { /* 更新位置信息 */ }
};class PhysicsBody : public Component {
public:void update() override { /* 物理模拟计算 */ }
};// 使用示例
GameObject player;
player.addComponent<Transform>();
player.addComponent<PhysicsBody>();
player.update();
3.2 状态模式实现角色行为控制
class CharacterState {
public:virtual void enter() = 0;virtual void handleInput(char input) = 0;virtual void update() = 0;virtual ~CharacterState() = default;
};class IdleState : public CharacterState {
public:void enter() override { std::cout << "Entering Idle\n"; }void handleInput(char input) override {if(input == 'w') /* 切换到移动状态 */;}void update() override { /* 闲置动画更新 */ }
};class StateMachine {std::unique_ptr<CharacterState> currentState;
public:void changeState(std::unique_ptr<CharacterState> newState) {if(currentState) currentState->exit();newState->enter();currentState = std::move(newState);}void update() {if(currentState) currentState->update();}
};// 使用示例
StateMachine fsm;
fsm.changeState(std::make_unique<IdleState>());while(true) {char input = getInput();fsm.handleInput(input);fsm.update();
}
五、设计模式最佳实践指南
1. 模式选择决策树
是否需要控制对象创建?
├─ 是 → 考虑工厂/建造者模式
├─ 否 → 是否需要扩展对象功能?
│ ├─ 是 → 装饰者/代理模式
│ └─ 否 → 是否需要算法切换?
│ ├─ 是 → 策略模式
│ └─ 否 → 是否需要状态管理?
│ ├─ 是 → 状态模式
│ └─ 否 → 观察者/命令模式
2. 典型代码异味与模式对应
代码问题 | 推荐模式 | 重构示例 |
---|---|---|
多重条件分支 | 策略/状态模式 | 用多态替代switch-case |
接口不兼容 | 适配器模式 | 包装旧接口为新接口 |
过度全局访问 | 单例→依赖注入 | 引入服务定位器 |
难以扩展功能 | 装饰者/组合模式 | 动态添加组件 |
紧耦合的对象通信 | 观察者/中介者模式 | 事件驱动架构 |
3. 现代C++设计原则
- 优先组合而非继承:使用std::variant/std::any实现运行时多态
- 利用RAII管理资源:智能指针自动管理模式对象生命周期
- 编译时多态优化:模板方法替代运行时虚函数分派
- 移动语义优化性能:在工厂模式中高效转移大型对象
- 类型擦除技术:使用std::function实现灵活的策略模式
六、常见陷阱与调试技巧
1. 单例模式的内存泄漏检测
使用Valgrind或AddressSanitizer检测未释放实例:
$ g++ -fsanitize=address -g singleton.cpp
$ ASAN_OPTIONS=detect_leaks=1 ./a.out
2. 观察者模式的循环引用排查
使用weak_ptr打破强引用循环:
class Subject {std::vector<std::weak_ptr<Observer>> observers;public:void addObserver(std::weak_ptr<Observer> obs) {observers.push_back(obs);}void notify() {for(auto& weakObs : observers) {if(auto obs = weakObs.lock()) {obs->update();}}}
};
3. 工厂模式的类型注册验证
静态断言确保类型安全:
template <typename T>
void registerType() {static_assert(std::is_base_of_v<BaseProduct, T>, "Must inherit from BaseProduct");// 注册逻辑...
}
七、延伸阅读与工具推荐
1. 进阶学习资源
- 《Modern C++ Design》Andrei Alexandrescu
- 《C++ Core Guidelines》设计模式章节
- CppCon会议演讲:Modern C++ Design Patterns
2. 可视化设计工具
- PlantUML:模式UML图生成
- Doxygen:模式文档自动化
- Clang-Query:模式代码静态检测
3. 性能分析工具链
工具名称 | 用途 | 示例命令 |
---|---|---|
Perf | 函数级热点分析 | perf record ./app |
Hotspot | 可视化性能数据 | 图形化展示perf结果 |
Cachegrind | 缓存访问模式分析 | valgrind --tool=cachegrind ./app |
相关文章:
【C++】八大常见的设计模式的实现与实践指南
目录 创建型模式 单例模式工厂方法模式抽象工厂模式 结构型模式 适配器模式装饰者模式代理模式 行为型模式 观察者模式策略模式命令模式 高级主题 现代C特性影响模式性能对比典型应用案例 设计模式分类 一、创建型模式 1. 单例模式(Singleton) 现代…...
OpenEMMA: 基于多模态大语言模型的端到端开源自动驾驶框架
OpenEMMA: 基于多模态大语言模型的端到端开源自动驾驶框架 创新点 OpenEMMA 将前置摄像头图像和车辆历史文本状态作为输入。驾驶任务被构建为视觉问答(VQA)问题,利用思维链推理来指导模型生成关键物体的详细描述、行为洞察和元驾驶决策。这…...
kali,NTFS,用户管理,文件共享,本地安全策略,计算机基础
kali更新源 vim /etc/apt/sources.list 优质源 中科大Kali镜像源deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contribdeb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib阿里云Kali镜像源deb http://mirrors.aliyun.com…...
零基础上手Python数据分析 (7):Python 面向对象编程初步
写在前面 回顾一下,我们已经学习了 Python 的基本语法、数据类型、常用数据结构和文件操作、异常处理等。 到目前为止,我们主要采用的是 面向过程 (Procedural Programming) 的编程方式,即按照步骤一步一步地编写代码,解决问题。 这种方式对于简单的任务已经足够,但当程序…...
基于深度学习的皮肤癌智能检测与语音提示系统【python源码+Pyqt5界面+数据集+训练代码】
《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...
脚本一键式启动Nginx、Mysql、Redis
此脚本包含拉取镜像、数据卷挂载、容器启动三大部分,可一键式安装三大环境 新建一个depoy.sh文件在服务器上,然后复制以下内容。 给脚本文件添加执行权限 chmod x depoy.sh # 文件的当前目录下 如果需要修改数据库MYSQL密码和Reids密码 MYSQL_ROO…...
蓝桥杯备赛-DFS-有奖问答
问题描述 小蓝正在参与一个现场问答的节目。活动中一共有 3030 道题目, 每题只有答对和答错两种情况, 每答对一题得 1010 分,答错一题分数归零。 小蓝可以在任意时刻结束答题并获得目前分数对应的奖项,之后不能再答任何题目。最高奖项需要 100100 分, …...
[AI速读]CHISEL vs. SystemVerilog:用RISC-V核心对比两种硬件设计语言
在硬件设计领域,选择合适的语言对开发效率、维护成本和最终性能都至关重要。最近,一项研究对比了两种硬件描述语言——CHISEL(基于Scala的嵌入式语言)和传统的SystemVerilog,它们分别实现了同一款RISC-V核心(SweRV-EL2)。以下是关键发现和结论。 为什么选择CHISEL? CHI…...
PHP PSR(PHP Standards Recommendations)介绍
PHP PSR(PHP Standards Recommendations)是 PHP 社区制定的一系列标准化规范,旨在统一 PHP 代码的编写方式、接口设计和开发实践,以提高代码的可读性、可维护性和互操作性。以下是核心 PSR 标准的解读和具体使用方法: …...
字节跳动实习生主导开发强化学习算法,助力大语言模型性能突破
目录 禹棋赢的背景与成就 主要成就 DAPO算法的技术细节 算法优势 禹棋赢的研究历程 关键时间节点 字节跳动的“Top Seed人才计划” 计划特点 小编总结 在大模型时代,经验不再是唯一的衡量标准,好奇心、执行力和对新技术的敏锐洞察力成为推动技术…...
Java并发编程面试题:锁(17题)
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
各类神经网络学习:(四)RNN 循环神经网络(下集),pytorch 版的 RNN 代码编写
上一篇下一篇RNN(中集)待编写 代码详解 pytorch 官网主要有两个可调用的模块,分别是 nn.RNNCell 和 nn.RNN ,下面会进行详细讲解。 RNN 的同步多对多、多对一、一对多等等结构都是由这两个模块实现的,只需要将对输入…...
【python】OpenCV—Hand Landmarks Detection
文章目录 1、功能描述2、代码实现3、效果展示4、完整代码5、涉及到的库函数6、参考 更多有趣的代码示例,可参考【Programming】 1、功能描述 基于 opencv-python 和 mediapipe 实现手部关键点的检测(无法检测出手,不过可以根据关键点的信息外…...
C++和标准库速成(十)——类型别名、类型定义、类型推断和标准库简介
目录 1. 类型别名2. 类型定义(不建议)3. 类型推断3.1 auto3.1.1 auto&3.1.2 auto*3.1.3 拷贝列表初始化和直接列表初始化 3.2 decltype 4. 标准库简介参考 1. 类型别名 类型别名为现有的类型声明提供新名称。可以将类型别名视为用于为现有类型声明引入同义词而无须创建新类…...
Java JMX 未授权访问漏洞分析与修复指南
#作者:张桐瑞 文章目录 一、漏洞背景二、漏洞描述三、漏洞影响四、修复方案1. 禁用远程JMX访问:2. 配置JMX访问权限: 一、漏洞背景 Java管理扩展(Java Management Extensions,简称JMX)是Java平台的管理和…...
挂谷问题与挂谷猜想:从平面转针到高维拓扑
挂谷问题与挂谷猜想:从平面转针到高维拓扑 目录 挂谷问题的起源数学定义与基本性质研究进展挂谷集合与挂谷猜想王虹与Joshua Zahl的突破意义与影响 挂谷问题的起源 1917年,日本数学家挂谷宗一(かけや そういち Soichi Kakeya,1886-1947)提…...
区块链 智能合约安全 | 整型溢出漏洞
目录: 核心概念 溢出类型 上溢 原理 案例 下溢 原理 案例 练习 漏洞修复 使用 SafeMath 库(旧版本) 升级 Solidity 版本(≥0.8.0) 地址:zkanzz 整型溢出漏洞(Integer Overflow/Underflow Vulne…...
C# HTTP 文件上传、下载服务器
程序需要管理员权限,vs需要管理员打开 首次运行需要执行以下命令注册URL(管理员命令行) netsh advfirewall firewall add rule name"FileShare" dirin actionallow protocolTCP localport8000 ipconfig | findstr "IPv4&quo…...
IDEA导入jar包后提示无法解析jar包中的类,比如无法解析符号 ‘log4j‘
IDEA导入jar包后提示无法解析jar包中的类 问题描述解决方法 问题描述 IDEA导入jar包的Maven坐标后,使用jar中的类比如log4j,仍然提示比如无法解析符号 log4j。 解决方法 在添加了依赖和配置文件后,确保刷新你的IDE项目和任何缓存ÿ…...
C++前缀和
个人主页:[PingdiGuo_guo] 收录专栏:[C干货专栏] 大家好,今天我们来了解一下C的一个重要概念:前缀和 目录 1.什么是前缀和 2.前缀和的用法 1.前缀和的定义 2.预处理前缀和数组 3.查询区间和 4.数组中某个区间的和是否为特定…...
kafka压缩
最近有幸公司参与kafka消息压缩,背景是日志消息量比较大。kafka版本2.4.1 一、确认压缩算法 根据场景不同选择不同。如果是带宽敏感患者推荐高压缩比的zstd,如果是cpu敏感患者推荐lz4 lz4和zstd底层都使用的是lz77算法,具体实现逻辑不同&am…...
C 语 言 --- 扫 雷 游 戏(初 阶 版)
C 语 言 --- 扫 雷 游 戏 初 阶 版 代 码 全 貌 与 功 能 介 绍扫雷游戏的功能说明游 戏 效 果 展 示游 戏 代 码 详 解game.htest.cgame.c 总结 💻作 者 简 介:曾 与 你 一 样 迷 茫,现 以 经 验 助 你 入 门 C 语 言 💡个 人 主…...
黑鲨外设2025春季新品发布会:全球首款“冷暖双控”鼠标亮相!
据可靠消息称,电竞外设领域的创新引领者——黑鲨外设,正式官宣将于2025年3月28日17:00召开主题为“究极体验,竞在其中”春季新品发布会。据悉,此次新品发布会将于黑鲨游戏外设和黑鲨游戏手机官方平台同步直播,…...
SpringBoot-MVC配置类与 Controller 的扫描
文章目录 前言一、自动配置类位置二、自动配置类解析2.1 WebMvcAutoConfiguration2.1.1 EnableWebMvcConfiguration 2.2 DispatcherServletAutoConfiguration 三、RequestMapping 的扫描过程3.1 RequestMappingHandlerMapping#afterPropertiesSet3.2 RequestMappingHandlerMapp…...
Nexus L2 L3基本配置
接口基本配置 N7K上所有端口默认处于shutdown状态; N5K上所有端口默认处于no shutdown状态(所有端口都是switchport) 默认所有接口都是三层route模式, 只有当线卡不支持三层的时候, 接口才会处于二层switchport模式 show run all | in “system default” 创建SVI口需要提前打…...
asp.net 4.5在医院自助系统中使用DeepSeek帮助医生分析患者报告
环境: asp.net 4.5Visual Studio 2015本地已经部署deepseek-r1:1.5b 涉及技术 ASP.NET MVC框架用于构建Web应用程序。使用HttpWebRequest和HttpWebResponse进行HTTP请求和响应处理。JSON序列化和反序列化用于构造和解析数据。SSE(服务器发送事件…...
LCCI ESG 中英联合认证国际分析师适合的岗位
LCCI ESG中英联合认证国际分析师领域热门岗位大揭秘!🌍 大家好!今天我们来探讨LCCI ESG中英联合认证国际分析师领域的热门岗位,看看是否有适合你的选择。 1️⃣ LCCI ESG中英联合认证国际分析师报告专员:主要负责编制…...
AGI成立的条件
AGI(通用人工智能)的成立需满足多项核心条件,这些条件既涵盖技术能力层面的突破,也涉及伦理与认知维度的考量。 一、通用性与多任务处理能力 跨领域泛化能力 AGI需具备类似人类的通用性,能够灵活切换不同领域…...
论文阅读:2023 EMNLP SeqXGPT: Sentence-level AI-generated text detection
总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 SeqXGPT: Sentence-level AI-generated text detection https://aclanthology.org/2023.emnlp-main.73/ https://github.com/Jihuai-wpy/SeqXGPT https://www.doubao.com/…...
解决python配置文件类configparser.ConfigParser,插入、读取数据,自动转为小写的问题
配置类 [Section1] Key_AAA Value[Section2] AnotherKey Value默认情况下,ConfigParser会将ini配置文件中的KEY,转为小写。 重载后配置类: 继承类从configparser.ConfigParser改为configparser.RawConfigParser重载方法optionxform&#…...
超图神经网络的详细解析与python示例
扩展传统集合关系至超边结构,处理高阶交互问题。 有关人工智能的数学基础之逻辑、集合论和模糊理论:看我文章人工智能的数学基础之逻辑、集合论和模糊理论-CSDN博客 一、超图神经网络概述 超图神经网络(Hypergraph Neural Network࿰…...
机器视觉中图像的腐蚀和膨胀是什么意思?它能用来做什么?
腐蚀(Erosion)和膨胀(Dilation)是两种基本的形态学操作,通常用于二值图像(黑白图像)的处理。它们是形态学图像处理的基础,广泛应用于图像分割、边缘检测、噪声去除等任务。 1…...
破局 MySQL 死锁:深入理解锁机制与高效解决方案
死锁的原理 1. 什么是死锁? 当 多个事务 在并发执行时,每个事务都 持有其他事务需要的锁,同时又在 等待对方释放锁,导致所有事务都无法继续执行的状态,称为 死锁(Deadlock)。 2. 死锁的四个必要…...
机器学习——分类、回归、聚类、LASSO回归、Ridge回归(自用)
纠正自己的误区:机器学习是一个大范围,并不是一个小的方向,比如:线性回归预测、卷积神经网络和强化学都是机器学习算法在不同场景的应用。 机器学习最为关键的是要有数据,也就是数据集 名词解释:数据集中的…...
脚本语言 Lua
概念 Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译、运行。Lua脚本可以很容易地被C/C 代码调用,也可以反过来调用C/C的函数,这使得Lua在应用程序中可以被广泛应用。Lua并没有提供强大的库,它是不适合作为开发独立应…...
Spring相关面试题
目录 Spring中常用的注解有哪些 Spring Boot中RestController和Controller注解有什么区别? Spring的注解requestBody和responseBody的区别 说说Bean和componentscan的区别 简单介绍一下springboot Spring Boot有哪些常用的Starter依赖? 说说sprin…...
Python学习- 数据结构类型
一. list list_data [10, 20, 30]列表:是一个不限制类型,可增加,修改,删除的数据类型 可操作的方法:append,extend, pop,del ,insert append: 可向list最后一个位置添加一个元…...
Azure Delta Lake、Databricks和Event Hubs实现实时欺诈检测
设计Azure云架构方案实现Azure Delta Lake和Azure Databricks,结合 Azure Event Hubs/Kafka 摄入实时数据,通过 Delta Lake 实现 Exactly-Once 语义,实时欺诈检测(流数据写入 Delta Lake,批处理模型实时更新࿰…...
【从零开始学习计算机科学】软件测试(十)嵌入式系统测试、游戏开发与测试过程、移动应用软件测试 与 云应用软件测试
【从零开始学习计算机科学】软件测试(十)嵌入式系统测试、游戏开发与测试过程、移动应用软件测试 与 云应用软件测试 嵌入式系统测试测试策略及测试流程嵌入式软件测试问题及测试方法嵌入式软件的测试流程游戏开发与测试过程游戏开发与通用软件的开发过程区别游戏测试主要内容…...
C#零基础入门篇(18. 文件操作指南)
## 一、文件操作基础 在C#中,文件操作主要通过System.IO命名空间中的类来实现,例如File、FileStream、FileInfo等。 ## 二、常用文件操作方法 ### (一)文件读取 1. **使用File.ReadAllText方法读取文件内容为字符串** …...
深入探究 JVM 堆的垃圾回收机制(一)— 判活
垃圾回收分为两步:1)判定对象是否存活。2)将“消亡”的对象进行内存回收。 1 判定对象存活 可达性分析算法:通过一系列“GC Roots”对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,…...
SQL优化主要有哪些方式
对经常查询的区分度高的条件字段建立索引,也就是用在where条件里的字段。使用没有建立索引的非主键字段作为条件查询时,会进行全表扫描,因为这个字段的数据分步是不规律的,但是需要避免在频繁更新的字段上建立索引,因为…...
基于Spring Boot的公司资产网站的设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
笔记本电脑关不了机是怎么回事 这有解决方法
在快节奏的现代生活中,笔记本电脑已成为我们工作、学习和娱乐的得力助手。在使用电脑的过程中,笔记本电脑突然关不了机了,怎么回事?下面驱动人生就来讲一讲笔记本电脑不能正常关机的解决方法,有需要的可以来看看。 一、…...
OSPF 协议详解:从概念原理到配置实践的全网互通实现
什么是OSPF OSPF(开放最短路径优先)是由IETF开发的基于链路状态的自治系统内部路由协议,用来代替存在一些问题的RIP协议。与距离矢量协议不同,链路状态路由协议关心网络中链路活接口的状态(包括UP、DOWN、IP地址、掩码…...
【C++】多态
目录 文章目录 前言 一、多态的概念 二、多态的定义及实现 三、重载/重写/隐藏的对比 四、纯虚函数和抽象类 五、多态的原理 总结 前言 本文主要讲述C中的多态,涉及的概念有虚函数、协变、纯虚函数、抽象类、虚表指针和虚函数表等。 一、多态的概念 多态分…...
CentOS 8 停止维护后通过 rpm 包手动安装 docker
根据 Docker官方文档 的指引,进入 Docker rpm 包下载的地址,根据自己系统的架构和具体版本选择对应的路径 这里使用 Index of linux/centos/7/x86_64/stable/ 版本,根据 docker 官方的给出的安装命令选择性的下载对应的 rpm 包 最终使用 yum …...
STT-MRAM CIM 赋能边缘 AI:高性能噪声鲁棒贝叶斯神经网络宏架构详解
引言 近年来,基于卷积神经网络(CNN)和视觉转换器(ViT)的存算一体(CIM)边缘AI设备因其低延迟、高能效、低成本等性能受到越来越广泛的关注。然而,当环境中存在噪声时(例如…...
Performance Hub Active Report
Performance Hub 是 Oracle Enterprise Manager Database Express (EM Express) 中的一项功能,可提供给定时间范围内所有性能数据的新整合视图。用户可以使用 Database Express 页面顶部的时间选择器选择时间范围,详细信息选项卡将…...
小白闯AI:Llama模型Lora中文微调实战
文章目录 0、缘起一、如何对大模型进行微调二、模型微调实战0、准备环境1、准备数据2、模型微调第一步、获取基础的预训练模型第二步:预处理数据集第三步:进行模型微调第四步:将微调后的模型保存到本地4、模型验证5、Ollama集成部署6、结果测试三、使用总结AI是什么?他应该…...