C++ 设计模式概述及常用模式

C++ 设计模式概述
本文介绍了C++中23种设计模式的分类及实现示例,主要分为三大类:

创建型模式(5个):单例模式(常用)、工厂方法模式(常用)、抽象工厂模式(常用)、建造者模式和原型模式。这些模式专注于对象的创建机制。

结构型模式(7个):适配器模式(常用)、桥接模式、组合模式和装饰器模式(常用)等。这些模式处理类和对象的组合方式。

行为型模式:未完整列出,但包含观察者模式等(未展示完整代码)。

文章通过简洁的C++代码示例展示了常用设计模式的实现方法,如单例模式通过私有构造函数和静态方法确保唯一实例,工厂方法模式通过抽象工厂类创建产品等。这些模式为解决特定设计问题提供了可重用的解决方案。

C++ 设计模式概述及常用模式

设计模式可分为三大类:创建型、结构型、行为型。以下是23个设计模式的分类及代码示例:

一、创建型模式(5个)

1. 单例模式(Singleton)⭐ 常用

classSingleton{private:static Singleton* instance;Singleton(){}// 私有构造函数public:static Singleton*getInstance(){if(instance ==nullptr){ instance =newSingleton();}return instance;}// 删除拷贝构造和赋值操作符Singleton(const Singleton&)=delete; Singleton&operator=(const Singleton&)=delete;};

2. 工厂方法模式(Factory Method)⭐ 常用

// 产品接口classProduct{public:virtual~Product(){}virtualvoidoperation()=0;};// 具体产品classConcreteProductA:publicProduct{public:voidoperation() override { cout <<"Product A operation"<< endl;}};// 工厂接口classCreator{public:virtual~Creator(){}virtual Product*factoryMethod()=0;};// 具体工厂classConcreteCreatorA:publicCreator{public: Product*factoryMethod() override {returnnewConcreteProductA();}};

3. 抽象工厂模式(Abstract Factory)⭐ 常用

// 抽象产品AclassAbstractProductA{public:virtual~AbstractProductA(){}virtualvoidoperationA()=0;};// 抽象产品BclassAbstractProductB{public:virtual~AbstractProductB(){}virtualvoidoperationB()=0;};// 抽象工厂classAbstractFactory{public:virtual AbstractProductA*createProductA()=0;virtual AbstractProductB*createProductB()=0;};// 具体工厂1classConcreteFactory1:publicAbstractFactory{public: AbstractProductA*createProductA() override {returnnewConcreteProductA1();} AbstractProductB*createProductB() override {returnnewConcreteProductB1();}};

4. 建造者模式(Builder)

classProduct{private: string partA; string partB;public:voidsetPartA(const string& a){ partA = a;}voidsetPartB(const string& b){ partB = b;}};classBuilder{public:virtual~Builder(){}virtualvoidbuildPartA()=0;virtualvoidbuildPartB()=0;virtual Product*getResult()=0;};classDirector{private: Builder* builder;public:Director(Builder* b):builder(b){}voidconstruct(){ builder->buildPartA(); builder->buildPartB();}};

5. 原型模式(Prototype)

classPrototype{public:virtual~Prototype(){}virtual Prototype*clone()const=0;virtualvoidprint()const=0;};classConcretePrototype:publicPrototype{private:int data;public:ConcretePrototype(int d):data(d){} Prototype*clone()const override {returnnewConcretePrototype(*this);}voidprint()const override { cout <<"Data: "<< data << endl;}};

二、结构型模式(7个)

6. 适配器模式(Adapter)⭐ 常用

// 目标接口classTarget{public:virtual~Target(){}virtualvoidrequest(){ cout <<"Target request"<< endl;}};// 需要适配的类classAdaptee{public:voidspecificRequest(){ cout <<"Adaptee specific request"<< endl;}};// 适配器classAdapter:publicTarget{private: Adaptee* adaptee;public:Adapter(Adaptee* a):adaptee(a){}voidrequest() override { adaptee->specificRequest();}};

7. 桥接模式(Bridge)

// 实现接口classImplementor{public:virtual~Implementor(){}virtualvoidoperationImpl()=0;};// 抽象类classAbstraction{protected: Implementor* impl;public:Abstraction(Implementor* i):impl(i){}virtual~Abstraction(){}virtualvoidoperation(){ impl->operationImpl();}};

8. 组合模式(Composite)

classComponent{public:virtual~Component(){}virtualvoidoperation()=0;virtualvoidadd(Component*){}virtualvoidremove(Component*){}virtual Component*getChild(int){returnnullptr;}};classLeaf:publicComponent{public:voidoperation() override { cout <<"Leaf operation"<< endl;}};classComposite:publicComponent{private: vector<Component*> children;public:voidoperation() override { cout <<"Composite operation"<< endl;for(auto child : children){ child->operation();}}voidadd(Component* c) override { children.push_back(c);}};

9. 装饰器模式(Decorator)⭐ 常用

classComponent{public:virtual~Component(){}virtualvoidoperation()=0;};classConcreteComponent:publicComponent{public:voidoperation() override { cout <<"ConcreteComponent operation"<< endl;}};classDecorator:publicComponent{protected: Component* component;public:Decorator(Component* c):component(c){}voidoperation() override { component->operation();}};classConcreteDecorator:publicDecorator{public:ConcreteDecorator(Component* c):Decorator(c){}voidoperation() override {Decorator::operation();addedBehavior();}voidaddedBehavior(){ cout <<"Added behavior"<< endl;}};

10. 外观模式(Facade)⭐ 常用

classSubsystemA{public:voidoperationA(){ cout <<"Subsystem A operation"<< endl;}};classSubsystemB{public:voidoperationB(){ cout <<"Subsystem B operation"<< endl;}};classFacade{private: SubsystemA* a; SubsystemB* b;public:Facade():a(newSubsystemA()),b(newSubsystemB()){}voidoperation(){ a->operationA(); b->operationB();}};

11. 享元模式(Flyweight)

classFlyweight{public:virtual~Flyweight(){}virtualvoidoperation(int extrinsicState)=0;};classConcreteFlyweight:publicFlyweight{private:int intrinsicState;public:ConcreteFlyweight(int state):intrinsicState(state){}voidoperation(int extrinsicState) override { cout <<"Intrinsic: "<< intrinsicState <<", Extrinsic: "<< extrinsicState << endl;}};classFlyweightFactory{private: unordered_map<int, Flyweight*> flyweights;public: Flyweight*getFlyweight(int key){if(flyweights.find(key)== flyweights.end()){ flyweights[key]=newConcreteFlyweight(key);}return flyweights[key];}};

12. 代理模式(Proxy)⭐ 常用

classSubject{public:virtual~Subject(){}virtualvoidrequest()=0;};classRealSubject:publicSubject{public:voidrequest() override { cout <<"RealSubject request"<< endl;}};classProxy:publicSubject{private: RealSubject* realSubject;public:Proxy():realSubject(nullptr){}voidrequest() override {if(realSubject ==nullptr){ realSubject =newRealSubject();} realSubject->request();}};

三、行为型模式(11个)

13. 责任链模式(Chain of Responsibility)

classHandler{protected: Handler* successor;public:Handler():successor(nullptr){}virtual~Handler(){}voidsetSuccessor(Handler* s){ successor = s;}virtualvoidhandleRequest(int request)=0;};classConcreteHandler1:publicHandler{public:voidhandleRequest(int request) override {if(request <10){ cout <<"Handler1 handled request "<< request << endl;}elseif(successor !=nullptr){ successor->handleRequest(request);}}};

14. 命令模式(Command)⭐ 常用

classReceiver{public:voidaction(){ cout <<"Receiver action"<< endl;}};classCommand{public:virtual~Command(){}virtualvoidexecute()=0;};classConcreteCommand:publicCommand{private: Receiver* receiver;public:ConcreteCommand(Receiver* r):receiver(r){}voidexecute() override { receiver->action();}};classInvoker{private: Command* command;public:voidsetCommand(Command* c){ command = c;}voidexecuteCommand(){ command->execute();}};

15. 解释器模式(Interpreter)

classContext{// 上下文信息};classExpression{public:virtual~Expression(){}virtualboolinterpret(Context& context)=0;};classTerminalExpression:publicExpression{public:boolinterpret(Context& context) override {// 终结符解释逻辑returntrue;}};

16. 迭代器模式(Iterator)⭐ 常用

template<typenameT>classIterator{public:virtual~Iterator(){}virtual T next()=0;virtualboolhasNext()=0;};template<typenameT>classConcreteIterator:publicIterator<T>{private: vector<T> collection; size_t position;public:ConcreteIterator(const vector<T>& col):collection(col),position(0){} T next() override {return collection[position++];}boolhasNext() override {return position < collection.size();}};

17. 中介者模式(Mediator)

classColleague;classMediator{public:virtual~Mediator(){}virtualvoidnotify(Colleague* sender, string event)=0;};classColleague{protected: Mediator* mediator;public:Colleague(Mediator* m =nullptr):mediator(m){}voidsetMediator(Mediator* m){ mediator = m;}};classConcreteColleague1:publicColleague{public:voiddoSomething(){// ... 自己的逻辑 mediator->notify(this,"event1");}};

18. 备忘录模式(Memento)

classMemento{private: string state;public:Memento(const string& s):state(s){} string getState()const{return state;}};classOriginator{private: string state;public:voidsetState(const string& s){ state = s;} string getState()const{return state;} Memento*createMemento(){returnnewMemento(state);}voidrestoreMemento(Memento* m){ state = m->getState();}};

19. 观察者模式(Observer)⭐ 常用

classObserver{public:virtual~Observer(){}virtualvoidupdate(float temperature)=0;};classSubject{private: vector<Observer*> observers;public:voidattach(Observer* o){ observers.push_back(o);}voiddetach(Observer* o){// 移除观察者逻辑}voidnotify(float temperature){for(auto observer : observers){ observer->update(temperature);}}};classConcreteObserver:publicObserver{public:voidupdate(float temperature) override { cout <<"Temperature updated: "<< temperature << endl;}};

20. 状态模式(State)

classContext;classState{public:virtual~State(){}virtualvoidhandle(Context* context)=0;};classContext{private: State* state;public:Context(State* s):state(s){}voidsetState(State* s){ state = s;}voidrequest(){ state->handle(this);}};classConcreteStateA:publicState{public:voidhandle(Context* context) override;};

21. 策略模式(Strategy)⭐ 常用

classStrategy{public:virtual~Strategy(){}virtualvoidalgorithm()=0;};classConcreteStrategyA:publicStrategy{public:voidalgorithm() override { cout <<"Strategy A algorithm"<< endl;}};classContext{private: Strategy* strategy;public:Context(Strategy* s):strategy(s){}voidsetStrategy(Strategy* s){ strategy = s;}voidexecuteStrategy(){ strategy->algorithm();}};

22. 模板方法模式(Template Method)⭐ 常用

classAbstractClass{public:virtual~AbstractClass(){}voidtemplateMethod(){primitiveOperation1();primitiveOperation2();}virtualvoidprimitiveOperation1()=0;virtualvoidprimitiveOperation2()=0;};classConcreteClass:publicAbstractClass{public:voidprimitiveOperation1() override { cout <<"Concrete operation 1"<< endl;}voidprimitiveOperation2() override { cout <<"Concrete operation 2"<< endl;}};

23. 访问者模式(Visitor)

classConcreteElementA;classConcreteElementB;classVisitor{public:virtual~Visitor(){}virtualvoidvisit(ConcreteElementA* element)=0;virtualvoidvisit(ConcreteElementB* element)=0;};classElement{public:virtual~Element(){}virtualvoidaccept(Visitor* visitor)=0;};classConcreteElementA:publicElement{public:voidaccept(Visitor* visitor) override { visitor->visit(this);}voidoperationA(){ cout <<"Operation A"<< endl;}};

四、最常用的设计模式(建议优先掌握)

必须掌握的5个核心模式

  1. 单例模式 - 全局唯一实例,如配置管理器、日志管理器
  2. 工厂方法模式 - 对象创建解耦,易于扩展
  3. 观察者模式 - 事件处理、消息通知系统
  4. 策略模式 - 算法封装,运行时切换
  5. 装饰器模式 - 动态添加功能

次常用的5个模式

  1. 适配器模式 - 接口转换
  2. 代理模式 - 访问控制、延迟加载
  3. 模板方法模式 - 算法框架定义
  4. 命令模式 - 命令封装、撤销/重做
  5. 外观模式 - 简化复杂子系统接口

学习建议

  1. 先从单例、工厂、观察者、策略开始学习
  2. 理解每种模式的应用场景而不仅仅是代码
  3. 避免过度设计,只在必要时使用设计模式
  4. C++11/14/17的现代特性(智能指针、lambda等)可以简化某些模式的实现

这些模式提供了经过验证的解决方案,能帮助你构建更灵活、可维护的软件系统。

Read more

入门篇--Python篇-3-为什么做AI开发首选Python,而不是Java或C++?

入门篇--Python篇-3-为什么做AI开发首选Python,而不是Java或C++?

作者:Weisian AI探索者 · 软件工程师 · 写给每一个想入行AI的你 哈喽,各位技术小伙伴~ 最近后台好多刚入门AI的同学问我:“想做AI开发,先学Python、Java还是C++呢?” 其实答案很明确——90%的AI开发场景,Python都是首选。 但不是说Java和C++不好,而是这两种语言的优势场景,和AI开发的核心需求不太匹配。今天就从大家实际开发会遇到的问题出发,把这个问题讲透:为什么Python能成为AI开发的“万能钥匙”,而Java、C++更适合做“专项补充”? 一、先搞懂:AI开发的核心需求是什么? 不管是做算法研究、模型训练,还是落地一个简单的AI应用(比如图像识别、聊天机器人),核心需求就3个: 1. 快速迭代:AI是“试错型”开发,比如调模型参数、改算法逻辑,可能要试几十上百次,开发效率直接决定进度; 2. 少造轮子:AI涉及大量复杂计算(矩阵运算、

私募排排网JS逆向实战:解密加密数据与Python调用全解析

1. 从抓包到逆向:一次完整的实战开场 大家好,我是老张,在数据采集和逆向这块摸爬滚打十来年了。今天想和大家分享一个非常有意思的实战案例——如何搞定私募排排网的数据加密。这个案例很典型,它不像一些简单的网站直接返回明文JSON,而是把核心数据用JS加密后返回,你需要先解密才能看到真容。整个过程就像侦探破案,一步步追踪线索,最终找到解密钥匙。如果你对爬虫、JS逆向或者金融数据采集感兴趣,这篇文章会带你走一遍完整的流程,从发现加密到最终用Python调通,我会把踩过的坑和关键技巧都讲清楚。 咱们的目标很明确,就是拿到私募排排网基金排行列表页的数据。当你打开浏览器开发者工具,查看网络请求时,会发现一个关键的XHR请求,地址是 https://sppwapi.simuwang.com/sun/ranking/fundRankV3。这个请求返回的数据乍一看是一堆乱码,或者是一个结构奇怪的JSON对象,里面有个 data 字段,内容像是经过Base64编码的密文。这就是典型的服务端加密,前端通过一段JavaScript逻辑进行解密后渲染到页面上。我们的任务就是找到这段解密逻辑,并用Python

OKX API v5新特性:python-okx库全面支持与使用指南

OKX API v5新特性:python-okx库全面支持与使用指南 【免费下载链接】python-okx 项目地址: https://gitcode.com/GitHub_Trending/py/python-okx 你还在为交易接口的复杂集成而烦恼?是否需要一个既能处理现货交易又能管理衍生品合约的Python工具?本文将带你一文掌握OKX API v5的全部新特性,通过python-okx库实现从账户管理到算法交易的全流程操作,让你的量化策略开发效率提升300%。 读完本文你将获得: * 5分钟快速上手的API接入指南 * 现货/衍生品交易的完整代码模板 * WebSocket实时行情推送的最佳实践 * 10+常见交易场景的解决方案 为什么选择python-okx库? OKX API v5作为行业领先的交易接口,提供了毫秒级的订单执行速度和全品类的交易支持。而python-okx库作为其官方推荐的Python封装,相比其他第三方库具有三大优势: 特性python-okx普通第三方库接口覆盖率100% REST API + WebSocket约60%核心接

如何安装 `.whl` 文件(Python Wheel 包)

如何安装 `.whl` 文件(Python Wheel 包)

目录标题 * 如何安装 `.whl` 文件(Python Wheel 包) * 🛠 安装前提 * 💻 安装方法(3种) * 方法 1:直接使用 pip 安装(推荐) * 方法 2:先进入文件目录再安装 * 方法 3:使用绝对路径(适合脚本中调用) * ⚠️ 常见问题解决 * 问题 1:版本不兼容错误 * 问题 2:缺少依赖 * 问题 3:权限不足 * 🔍 验证安装 * 💡 进阶技巧 如何安装 .whl 文件(Python Wheel 包) .whl 文件是 Python 的 二进制分发格式(Wheel 格式),用于快速安装 Python