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

能否给出更多现代C++设计模式的示例

好的,以下是一些现代 C++ 中常见设计模式的实现示例:


1. 单例模式 (Singleton)

确保一个类只有一个实例,并提供全局访问点。

class Singleton { public: static Singleton& getInstance() { static Singleton instance; // 线程安全(C++11起) return instance; } void doSomething() { // 业务逻辑 } // 禁用拷贝和赋值 Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete; private: Singleton() = default; // 私有构造函数 }; // 使用示例 Singleton::getInstance().doSomething();

2. 策略模式 (Strategy)

定义一系列算法,并将每个算法封装起来,使它们可以互相替换。

#include <functional> #include <iostream> class Context { public: using Strategy = std::function<void()>; explicit Context(Strategy strategy) : strategy_(std::move(strategy)) {} void executeStrategy() { if (strategy_) strategy_(); } private: Strategy strategy_; }; // 使用示例 int main() { Context ctx1([]{ std::cout << "Strategy A\n"; }); Context ctx2([]{ std::cout << "Strategy B\n"; }); ctx1.executeStrategy(); // 输出: Strategy A ctx2.executeStrategy(); // 输出: Strategy B }

3. 观察者模式 (Observer)

定义对象间的一对多依赖关系,当一个对象状态改变时,所有依赖它的对象都会收到通知。

#include <vector> #include <functional> #include <iostream> class Subject { public: using Observer = std::function<void()>; void attach(Observer obs) { observers_.push_back(std::move(obs)); } void notify() { for (const auto& obs : observers_) { obs(); } } private: std::vector<Observer> observers_; }; // 使用示例 int main() { Subject subject; subject.attach([]{ std::cout << "Observer 1 notified\n"; }); subject.attach([]{ std::cout << "Observer 2 notified\n"; }); subject.notify(); // 输出: // Observer 1 notified // Observer 2 notified }

4. 工厂模式 (Factory)

定义一个创建对象的接口,但由子类决定实例化哪个类。

#include <memory> #include <iostream> class Product { public: virtual ~Product() = default; virtual void use() = 0; }; class ConcreteProductA : public Product { public: void use() override { std::cout << "Using Product A\n"; } }; class ConcreteProductB : public Product { public: void use() override { std::cout << "Using Product B\n"; } }; class Factory { public: virtual std::unique_ptr<Product> createProduct() = 0; }; class FactoryA : public Factory { public: std::unique_ptr<Product> createProduct() override { return std::make_unique<ConcreteProductA>(); } }; class FactoryB : public Factory { public: std::unique_ptr<Product> createProduct() override { return std::make_unique<ConcreteProductB>(); } }; // 使用示例 int main() { FactoryA factoryA; auto productA = factoryA.createProduct(); productA->use(); // 输出: Using Product A FactoryB factoryB; auto productB = factoryB.createProduct(); productB->use(); // 输出: Using Product B }

5. 访问者模式 (Visitor)

在不修改对象结构的前提下定义新操作。

#include <vector> #include <memory> #include <iostream> class Element; class ConcreteElementA; class ConcreteElementB; class Visitor { public: virtual void visit(ConcreteElementA& element) = 0; virtual void visit(ConcreteElementB& element) = 0; }; class Element { public: virtual ~Element() = default; virtual void accept(Visitor& visitor) = 0; }; class ConcreteElementA : public Element { public: void accept(Visitor& visitor) override { visitor.visit(*this); } }; class ConcreteElementB : public Element { public: void accept(Visitor& visitor) override { visitor.visit(*this); } }; class ConcreteVisitor : public Visitor { public: void visit(ConcreteElementA& element) override { std::cout << "Visitor processing ElementA\n"; } void visit(ConcreteElementB& element) override { std::cout << "Visitor processing ElementB\n"; } }; // 使用示例 int main() { std::vector<std::unique_ptr<Element>> elements; elements.push_back(std::make_unique<ConcreteElementA>()); elements.push_back(std::make_unique<ConcreteElementB>()); ConcreteVisitor visitor; for (auto& elem : elements) { elem->accept(visitor); } // 输出: // Visitor processing ElementA // Visitor processing ElementB }

以上示例结合了现代 C++ 特性(如std::function、智能指针、lambda 等),可根据实际需求调整实现细节。

http://www.cnnetsun.cn/news/1889905.html

相关文章:

  • 多模态大模型低资源训练避坑手册:从数据瓶颈、模态失衡到梯度冲突,12个生产环境真实故障点全复盘
  • 别等竞品上线才醒悟:2026奇点大会手势大模型商用许可窗口期仅剩117天(附合规接入倒计时自查表)
  • 英雄联盟智能助手League Akari:告别繁琐操作,专注核心对战
  • LaTeX技巧:优雅隐藏subfloat编号的三种实用方案
  • Ollama部署embeddinggemma-300m:端侧AI新范式——手机/笔记本实时嵌入生成教程
  • AlienFX Tools终极指南:深度解析开源Alienware控制框架与高效配置
  • M2LOrder模型解决GitHub访问与开源项目协作难题
  • FPGA verilog can mcp2515 altera xilinx工程 代码 程序
  • VRCFaceTracking安装和iPhone面捕配置教程,有bug
  • AI专著撰写宝典:热门工具深度剖析,让专著写作变得简单高效
  • DNF私服商业级部署实战:从零到一构建稳定可运营的服务端
  • 3步解决Windows 11 LTSC 24H2缺失微软商店问题:一键恢复完整应用生态
  • Agentic 应用落地必看!手把手搭建 Dify 全链路可观测系统
  • VideoSrt:一款让视频字幕制作变得简单的Windows工具
  • 3分钟搞定Windows风扇智能控制:FanControl终极免费指南
  • 【本源量子】精度与效率双提升!本源量子云上线量子气象灾害预测应用
  • Proxmox VE显卡直通后,如何给你的Ubuntu 22.04 LTS虚拟机装上NVIDIA驱动和CUDA 12.4
  • KeymouseGo:免编程自动化神器,轻松录制鼠标键盘操作实现高效办公
  • 【Linux】nohup 命令实战:后台任务管理与日志重定向技巧
  • Pixel Script Temple 与YOLOv5结合:为生成的像素画智能添加标注
  • 034.前端界面开发:用HTML/CSS/JS搭个检测结果展示页面
  • ExplorerPatcher终极指南:5分钟让Windows 11重获经典界面体验
  • 还在担心数据泄露?受管文件传输(MFT)有哪些主流选择?
  • 保姆级教程:用YOLOv8和PyQt5从零搭建一个无人机视角的车辆检测桌面应用
  • 收藏 | 新手程序员必看:AI Agent 记忆机制深度解析(阿里面试题)
  • CoPaw开源生态集成:与LangChain、LlamaIndex构建智能体
  • biliTickerBuy:3步搞定B站会员购抢票难题,让漫展门票不再错过
  • Cursor破解工具终极指南:三步解锁AI编程助手完整功能
  • 从ROS话题到浏览器:五种网页可视化方案的实战解析
  • Nuttx RTOS入门-简介及开源代码运行