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

【数据结构】感受递归暴力美学:链式二叉树全方位剖析(附源码)

【数据结构】感受递归暴力美学:链式二叉树全方位剖析(附源码)

🔥 @晨非辰Tong: 个人主页 👀专栏:《C语言》、《数据结构与算法入门指南》 💪学习阶段:C语言、数据结构与算法初学者 ⏳“人理解迭代,神理解递归。” 文章目录 * **引言** * 一、介绍链式二叉树 * 1.1 概念 * 1.2 基本结构(结构上的递归性) * 二、遍历接口实现(操作上的递归性) * 2.1 前序遍历(根左右) * 1. 概念 * 2. 代码 * 2.2 中序遍历(左根右) * 1. 概念 * 2.代码 * 2.3 后序遍历 * 1. 概念 * 2. 代码 * 三、其余接口实现(操作上的递归性)

By Ne0inhk
深度学习毕设项目:基于python-CNN机器学习训练香蕉成熟度识别基于python-CNN深度学习训练香蕉成熟度识别

深度学习毕设项目:基于python-CNN机器学习训练香蕉成熟度识别基于python-CNN深度学习训练香蕉成熟度识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围::小程序、SpringBoot、SSM、JSP、Vue、PHP、Java、python、爬虫、数据可视化、大数据、物联网、机器学习等设计与开发。 主要内容:免费开题报告、任务书、全bao定制+中期检查PPT、代码编写、🚢文编写和辅导、🚢文降重、长期答辩答疑辅导、一对一专业代码讲解辅导答辩、模拟答辩演练、和理解代码逻辑思路。 特色服务内容:答辩必过班 (全程一对一技术交流,帮助大家顺利完成答辩,小白必选) 全网粉丝50W+,累计帮助2000+完成优秀毕设 🍅文末获取源码🍅 感兴趣的可以先收藏起来,还有大家在毕设选题,

By Ne0inhk

Python 语法

一、基础语法规则 1. 注释 Python 的注释分为单行注释和多行注释,用于解释代码,不参与执行: python 运行 # 这是单行注释(最常用) """ 这是多行注释 可以写多行内容 也常用作字符串定义 """ ''' 这也是多行注释 和双引号效果一致 ''' 2. 缩进(Python 的灵魂) Python 不使用{}分隔代码块,而是通过缩进(4 个空格 / 1 个 Tab)区分层级,缩进错误会直接报错: python 运行 # 正确缩进 if 5 >

By Ne0inhk

Feishu-OpenAI余额查询与监控:实时掌握Token消耗情况的终极指南

Feishu-OpenAI余额查询与监控:实时掌握Token消耗情况的终极指南 【免费下载链接】feishu-openai 项目地址: https://gitcode.com/gh_mirrors/fei/feishu-openai 想要实时监控OpenAI API的Token使用情况,避免意外超支吗?Feishu-OpenAI项目提供了完整的余额查询与监控解决方案,让你在飞书平台上轻松掌握API消耗。本文将为你详细介绍如何通过这款强大的工具实时跟踪Token使用,确保预算可控。 🎯 为什么需要Token消耗监控? 在使用OpenAI API时,Token消耗直接关系到成本控制。没有实时监控,很容易出现以下问题: * 突然的费用激增 * 项目预算超支 * 服务意外中断 Feishu-OpenAI的余额查询功能正是为了解决这些痛点而生! 🚀 快速开始:一键配置余额监控 配置Feishu-OpenAI的余额监控功能非常简单。首先通过Git克隆项目: git clone https://gitcode.com/gh_mirrors/fei/feishu-o

By Ne0inhk