返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++常用的11种设计模式解释及示例代码详解
  • 611
分享到

C++常用的11种设计模式解释及示例代码详解

C++常用的11种设计模式C++常用设计模式 2023-02-07 12:02:09 611人浏览 安东尼
摘要

目录工厂模式单例模式适配器模式外观模式代理模式桥接模式模板方法模式策略模式观察者模式责任链模式c++常用的设计模式包括单例模式、工厂模式、抽象工厂模式、适配器模式、装饰者模式、代理模

c++常用的设计模式包括单例模式、工厂模式、抽象工厂模式、适配器模式、装饰者模式、代理模式、外观模式、桥接模式、组合模式、享元模式、观察者模式和命令模式等。使用设计模式的好处:提高代码的可读性和可维护性;将常见的设计问题隔离程序的业务逻辑;重用已有的实现;消除重复代码;消除手动调整代码以达到正确逻辑的所有痛苦。

工厂模式

C++工厂模式是一种模式,它是一种创建对象的有效方法。它允许我们使用一个类来负责创建实现特定接口的不同具体类的实例,而无需明确指定该实例的具体类。通过抽象出一个工厂类来负责每个子类的实例化,使得代码的可维护性大大增加。这种模式也使得添加新类型的实例变得容易,只要扩展工厂类即可。

#include<iOStream> 
using namespace std; 
 // A 'Product' class
class Product 
{ 
public: 
	virtual void show() = 0; 
}; 
 // A 'ConcreteProduct' class
class ConcreteProduct : public Product 
{ 
public: 
	void show() { cout << "I am a ConcreteProduct object" << endl; } 
}; 
 // A 'Creator' abstract class
class Creator 
{ 
public: 
	virtual Product* createProduct() = 0; 
}; 
 // A 'ConcreteCreator' class
class ConcreteCreator : public Creator 
{ 
public: 
	Product* createProduct() 
	{ 
		return new ConcreteProduct(); 
	} 
}; 
 // Client 
int main() 
{ 
	Creator* creator = new ConcreteCreator(); 
	Product* product = creator->createProduct(); 
	product->show(); 
	return 0; 
}

单例模式

单例 Singleton 是设计模式的一种,其特点是只提供唯一一个类的实例,具有全局变量的特点,在任何位置都可以通过接口获取到那个唯一实例。

class Singleton
{
    private:
        static Singleton* instance;
        Singleton() { }
     public:
        static Singleton* getInstance() {
            if(instance == nullptr)
                instance = new Singleton();
            return instance;
        }
};
 Singleton* Singleton::instance = nullptr;

以上只是一种通用实现教学版,即懒汉版(Lazy Singleton):单例实例在第一次被使用时才进行初始化,这叫做延迟初始化,然而可能存在内存泄漏的风险,且这个代码在单线程环境下是正确无误的,但是当拿到多线程环境下时这份代码就会出现race condition。

C++11规定了local static在多线程条件下的初始化行为,要求编译器保证了内部静态变量的线程安全性。在C++11标准下,《Effective C++》提出了一种更优雅的单例模式实现,使用函数内的 local static 对象。这样,只有当第一次访问getInstance()方法时才创建实例。这种方法也被称为Meyers' Singleton。C++0x之后该实现是线程安全的,C++0x之前仍需加

class Singleton
{
private:
	Singleton() { };
	~Singleton() { };
	Singleton(const Singleton&);
	Singleton& operator=(const Singleton&);
public:
	static Singleton& getInstance() 
        {
		static Singleton instance;
		return instance;
	}
};

适配器模式

C++ 适配器模式是一种结构型设计模式,它允许现有的类在不修改其内部结构的情况下在其他类中可用。它使用适配器来将不兼容的接口转换成用于目标类的接口。适配器模式使客户端能够调用他们正在使用的接口,而实际上正在使用另一个接口,这个新接口已经与客户端的要求匹配。

#include <iostream> 
using namespace std; 
 // 定义接口 
class Target 
{ 
    virtual void request() = 0; 
}; 
 // 创建一个需要被适配的类 
class Adaptee 
{ 
    void specificRequest(); 
}; 
 // 创建一个适配器 
class Adapter : public Target 
{ 
    Adaptee *adaptee; 
 public: 
    Adapter(Adaptee *adaptee) { this->adaptee = adaptee; } 
    void request() 
    { 
        // 执行specificRequest方法 
        adaptee->specificRequest(); 
    } 
}; 
 int main() 
{ 
    Adaptee *adaptee = new Adaptee(); 
    Target *target = new Adapter(adaptee); 
    target->request(); 
    return 0; 
}

外观模式

在C++中,外观模式是一种使用来简化系统接口的模式。它由一个“外观”类定义,这个类知道要包装的一系列子系统类。客户可以通过外观类直接访问子系统中的功能而不必了解内部细节。这样会降低时间和精力,可以减少客户端访问子系统的数量,所以它是一种简易的方法,用于整合子系统的接口。

Façade模式
class ComputerFacade 
{ 
    private: 
        CPU *cpu; 
        Memory *mem; 
        HardDrive *hd; 
     public: 
        ComputerFacade() 
        { 
            cpu = new CPU(); 
            mem = new Memory(); 
            hd = new HardDrive(); 
        } 
         ~ComputerFacade() 
        { 
            delete cpu; 
            delete mem; 
            delete hd; 
        } 
        void startComputer() 
        { 
            cpu->freeze(); 
            mem->load(BOOT_ADDRESS, hd->read(BOOT_SECTOR, SECTOR_SIZE)); 
            cpu->execute(); 
        } 
};

代理模式

代理模式(Proxy Pattern)是一种结构型设计模式,它为另外一个对象提供一个替代或占位符。当客户无法直接访问另外一个对象时,代理就可以担任中间人的角色,这样,客户就可以通过代理对象访问那个对象了。C++ 可以使用代理模式来实现对象的访问控制,可以使用该模式来管理对象的生命周期,也可以使用该模式来控制对象的访问,以及在跨平台上实现方法调用。


 #include <iostream>
 // 真实对象基类
class RealObject 
{
 public:
  virtual void doSomething() = 0;
};
 // 真实对象实现类
class RealObjectImpl : public RealObject
{
 public:
  virtual void doSomething() 
  {
   std::cout << "Doing something in RealObjectImpl" << std::endl;
  }
};
 // 代理对象基类,保存一个指向 RealObjectImpl 
// 对象的指针
class ProxyObject 
{
 private:
  RealObject* m_realObject;
  public:
  ProxyObject() : m_realObject(nullptr)
  {
   m_realObject = new RealObjectImpl();
  }
   ~ProxyObject()
  {
   delete m_realObject;
   m_realObject = nullptr;
  }
   // 调用真实对象的 doSomething()
  void doSomething() 
  {
   if(m_realObject != nullptr) 
   {
    m_realObject->doSomething();
   }
  }
};
 int main() 
{
 ProxyObject proxyObject;
 proxyObject.doSomething();
  return 0;
}

桥接模式

C++桥接模式是一种设计模式,它把抽象和实现分离开来,以便两者独立地变化。此模式在不同的编程语言之间创建了一个“桥”,支持平台无关性,以实现代码重用。它通常由抽象类处理,以及一个“管理类”,该类将实现类注入抽象类中。

// Bridge Pattern – C++ 
#include <iostream> 
 // Abstract class having the implementation for the interface
class Shape 
{ 
public: 
	virtual void draw() = 0; 
	virtual ~Shape(){} 
}; 
 // Concrete class 1 
class Rectangle : public Shape 
{ 
public: 
	void draw() override 
	{ 
		std::cout << "Drawing a rectangle." << std::endl; 
	} 
}; 
 // Concrete class 2 
class Circle : public Shape 
{ 
public: 
	void draw() override 
	{ 
		std::cout << "Drawing a circle." << std::endl; 
	} 
}; 
 // Bridge between implementation and interface 
class Drawingapi 
{ 
public: 
	virtual void drawCircle(double x, double y, double radius) = 0; 
	virtual void drawRectangle(double x, double y, double width, 
								double height) = 0; 
	virtual ~DrawingAPI() {} 
}; 
 // Concrete bridge 1 
class DrawingAPI1 : public DrawingAPI 
{ 
public: 
	void drawCircle(double x, double y, double radius) override 
	{ 
		std::cout << "API1.circle at " << x << ':' << y 
				<< ' ' << radius << std::endl; 
	} 
 	void drawRectangle(double x, double y, double width, 
						double height) override 
	{ 
		std::cout << "API1.rectangle at " << x << ':' << y 
				<< ' ' << width << 'x' << height << std::endl; 
	} 
}; 
 // Concrete bridge 2 
class DrawingAPI2 : public DrawingAPI 
{ 
public: 
	void drawCircle(double x, double y, double radius) override 
	{ 
		std::cout << "API2.circle at " << x << ':' << y 
				<< ' ' << radius << std::endl; 
	} 
	void drawRectangle(double x, double y, double width, 
						double height) override 
	{ 
		std::cout << "API2.rectangle at " << x << ':' << y 
				<< ' ' << width << 'x' << height << std::endl; 
	} 
}; 
 // Shape implementation using bridge 
class Shape1 : public Shape 
{ 
private: 
	DrawingAPI* m_drawingAPI; 
public: 
	Shape1(DrawingAPI* drawingAPI) 
		: m_drawingAPI(drawingAPI) 
	{ } 
 	void draw() override 
	{ 
		m_drawingAPI->drawCircle(1.0, 2.0, 3.0); 
	} 
}; 
 // Another shape using same bridge 
class Shape2 : public Shape 
{ 
private: 
	DrawingAPI* m_drawingAPI; 
public: 
	Shape2(DrawingAPI* drawingAPI) 
		: m_drawingAPI(drawingAPI) 
	{ } 
 	void draw() override 
	{ 
		m_drawingAPI->drawRectangle(4.0, 5.0, 6.0, 7.0); 
	} 
}; 
 // Client 
int main() 
{ 
	DrawingAPI* drawingAPI = new DrawingAPI1(); 
 	Shape* shapes[2] = 
	{ 
		new Shape1(drawingAPI), 
		new Shape2(drawingAPI) 
	}; 
 	for (Shape* shape : shapes) 
		shape->draw(); 
 	return 0; 
}

模板方法模式

模板方法模式是指定义一个操作中算法框架,而将算法的一些步骤延迟到子类中实现。模板方法模式使得子类可以不改变算法的结构即可重定义算法的某些特定步骤。 它是一种行为设计模式,它定义一个算法的模板,将一些计算步骤推迟到子类中。 在C++中,模板方法通常采用继承机制实现,在基类中定义算法的框架,在子类中实现算法的某些步骤。

//Base class
template <class T> 
class Base 
{ 
public:
  void templateMethod() 
  { 
    step1(); 
    step2(); 
    step3(); 
    step4(); 
  } 
  virtual void step1() = 0; 
  virtual void step2() = 0; 
  virtual void step3() = 0; 
  virtual void step4() = 0; 
}; 
 //Derived class
template <class T> 
class Derived : public Base<T> 
{ 
public:
  Derived(T data):m_data(data) {} 
  virtual void step1() 
  { 
    std::cout<<"Step 1 with the data: "<< m_data <<std::endl; 
  } 
  virtual void step2() 
  { 
    std::cout<<"Step 2 with the data: "<< m_data <<std::endl; 
  } 
  virtual void step3() 
  { 
    std::cout<<"Step 3 with the data: "<< m_data <<std::endl; 
  } 
  virtual void step4() 
  { 
    std::cout<<"Step 4 with the data: "<< m_data <<std::endl; 
  } 
private:
  T m_data; 
}; 
 //Client 
int main() 
{ 
  Base<int> *b = new Derived<int>(10); 
  b->templateMethod(); 
  delete b; 
  return 0; 
}

策略模式

是一种行为设计模式,它定义了一组算法,他们可以以相同的接口共享。这种模式使用场景最多的就是在根据不同的条件选择不同的行为时,可以使用此模式进行解耦,使得你的代码更加易于维护和扩展,当然也要看开发场景。

#include <iostream> 
using namespace std; 
// 抽象策略类
class Strategy 
{ 
public: 
    virtual void AlGorithmInterface() = 0; // 策略接口
}; 
// 具体策略类A 
class ConcreteStrategyA : public Strategy 
{ 
public:  
    void AlgorithmInterface() 
    { 
        cout<<"using algoritm A"<<endl; 
    } 
}; 
// 具体策略类B 
class ConcreteStrategyB : public Strategy 
{ 
public:  
    void AlgorithmInterface() 
    { 
        cout<<"using algoritm B"<<endl; 
    } 
}; 
// 环境类Context 
 class Context  
{ 
private: 
    Strategy * strategy;    // 私有策略类指针 
public: 
    Context(Strategy * pStrategy) 
    { 
        this->strategy = pStrategy; 
    } 
    void DoAction() 
    { 
        strategy->AlgorithmInterface();    // 使用策略类 
    } 
}; 
 // 使用
int main() 
{ 
    Context contextA(new ConcreteStrategyA); // 设定策略A 
    contextA.DoAction();  
    Context contextB(new ConcreteStrategyB);  // 设定策略B 
    contextB.DoAction(); 
    return 0; 
}

观察者模式

观察者模式是一种行为型设计模式,它允许多个“观察者”被通知某些情况的变化。被观察的对象(通常称为被观察者)将不断发出关于自身状态的更新通知,而这些观察者则侦听此变化并执行相应的操作。在C++中,观察者模式可以使用虚函数,继承,容器和模板类来实现。

#include <iostream>
#include <list>
 // 抽象被观察者的接口
class Subject {
public:
    // 注册观察者
    virtual void Attach(Observer* pObserver) = 0;
    // 移除观察者
    virtual void Detach(Observer* pObserver) = 0;
    // 通知所有观察者
    virtual void Notify() = 0;
     virtual ~Subject(){}
};
 // 抽象观察者的接口
class Observer {
public:
    // 响应被观察者的通知
    virtual void Update() = 0;
     virtual ~Observer(){}
};
 // 被观察者
class ConcreteSubject : public Subject {
public:
    void Attach(Observer* pObserver) override {
        m_observers.push_back(pObserver);
    }
    void Detach(Observer* pObserver) override {
        m_observers.remove(pObserver);
    }
    void Notify() override {
        for (auto pObserver : m_observers)
            pObserver->Update();
    }
 private:
    std::list<Observer*> m_observers;
};
 // 具体观察者
class ConcreteObserver1 : public Observer {
public:
    void Update() override {
        std::cout << "ConcreteObserver1 Update" << std::endl;
    }
};
 class ConcreteObserver2 : public Observer {
public:
    void Update() override {
        std::cout << "ConcreteObserver2 Update" << std::endl;
    }
};
 int main() {
    ConcreteSubject subject;
    ConcreteObserver1 observer1;
    ConcreteObserver2 observer2;
    subject.Attach(&observer1);
    subject.Attach(&observer2);
    subject.Notify();
    return 0;
}

责任链模式

责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它定义了请求的处理者对象之间的关系,并使多个处理者有机会处理该请求。当发出一个请求时,请求将沿着链条一直传递,直到链上的某一个处理者决定请求的处理方式。

#include<iostream> 
using namespace std; 
 //定义抽象类Handler 
class Handler 
{ 
protected: 
    Handler* successor; // 定义后继对象 
public: 
    Handler() { 
        successor = NULL; 
    } 
    void SetSuccessor(Handler* suc) { 
        successor = suc; 
    } 
    virtual void HandleRequest() = 0; // 处理请求的抽象方法 
}; 
 //实现抽象类Handler 
class ConcreteHandler1 : public Handler 
{ 
public: 
    void HandleRequest() { 
        if (successor != NULL) { 
            cout << "ConcreteHandler1 放过请求" << endl; 
            successor->HandleRequest(); 
        } 
        else
        { 
            cout << "ConcreteHandler1 处理请求"<<endl; 
        } 
    } 
}; 
 class ConcreteHandler2 : public Handler 
{ 
public: 
    void HandleRequest() { 
        if (successor != NULL) { 
            cout << "ConcreteHandler2 放过请求" << endl; 
            successor->HandleRequest(); 
        } 
        else
        { 
            cout << "ConcreteHandler2 处理请求"<<endl; 
        } 
    } 
}; 
 //Client四 
int main(int arGC, char* argv[]) 
{ 
    ConcreteHandler1* handler1 = new ConcreteHandler1(); 
    ConcreteHandler2* handler2 = new ConcreteHandler2(); 
    handler1->SetSuccessor(handler2); 
    handler1->HandleRequest(); 
    return 0; 
}

到此这篇关于C++常用的11种设计模式解释及示例的文章就介绍到这了,更多相关C++常用的11种设计模式内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++常用的11种设计模式解释及示例代码详解

本文链接: https://lsjlt.com/news/194464.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++常用的11种设计模式解释及示例代码详解
    目录工厂模式单例模式适配器模式外观模式代理模式桥接模式模板方法模式策略模式观察者模式责任链模式c++常用的设计模式包括单例模式、工厂模式、抽象工厂模式、适配器模式、装饰者模式、代理模...
    99+
    2023-02-07
    C++常用的11种设计模式 C++常用设计模式
  • c++代码各种注释示例详解
    目录1、前言2、正文(危)1.以代码例子为例(1)代码段1(2)代码段2(3)代码段3(4)代码段42.其它的注释方法(1)条件编译(2)if条件1、前言 今天想带大家来了解一下注释...
    99+
    2024-04-02
  • Java之dao模式详解及代码示例
    什么是dao模式?DAO(Data Access Object)顾名思义是一个为数据库或其他持久化机制提供了抽象接口的对象,在不暴露底层持久化方案实现细节的前提下提供了各种数据访问操作。在实际的开发中,应该将所有对数据源的访问操作进行抽象化...
    99+
    2023-05-30
    java dao设计模式 ava
  • C++设计模式之单例模式详解
    目录单例模式:就是只有一个实例。单例模式又分为两种基本的情形:饿汉式和懒汉式如下是懒汉式单例类小结:继续看单例模式总结单例模式:就是只有一个实例。 singleton pattern...
    99+
    2024-04-02
  • Java设计模式之单例模式示例详解
    目录0.概述1.饿汉式1.1 饿汉式单例实现1.2 破坏单例的几种情况1.3 预防单例的破坏2.枚举饿汉式2.1 枚举单例实现2.2 破坏单例3.懒汉式4.双检锁懒汉式5.内部类懒汉...
    99+
    2024-04-02
  • Java中常用的设计模式之单例模式详解
    目录注意优点缺点使用场景一、实现方式二、实现方式三、测试总结注意 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。 优点...
    99+
    2024-04-02
  • Java结构型设计模式中代理模式示例详解
    目录代理模式分类主要角色作用静态代理与动态代理的区别静态代理的基本使用创建抽象主题创建真实主题创建代理主题客户端调用JDK动态代理的基本使用创建抽象主题创建真实主题创建代理主题客户端...
    99+
    2024-04-02
  • Java设计模式之原型模式的示例详解
    目录定义案例需求方案一方案二对比分析总结 定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 即实现了一个原型接口,该接口用于创建当前对象的克隆,当直接创建对象的代...
    99+
    2024-04-02
  • Java设计模式之桥接模式的示例详解
    目录定义案例需求方案一方案二对比分析总结定义 桥梁模式是对象的结构模式。又称为柄体(Handle and Body)模式或接口(Interface)模式。桥梁模式的用意是&ldquo...
    99+
    2024-04-02
  • Java设计模式之组合模式的示例详解
    目录定义原理类图案例需求方案分析总结定义 组合模式,又叫部分整体模式,它创建了对象组的数据结构(将对象组合成树状结构,用来表示部分整体的层级关系)组合模式使得用户对单个对象和组合对象...
    99+
    2024-04-02
  • C++单例设计模式详细讲解
    目录特殊类设计只能在堆上创建对象的类请设计一个类只能在栈上创建对象请设计一个类不能被拷贝请设计一个类不能被继承请设计一个类只能创建一个对象(单例模式)懒汉模式和饿汉模式的对比特殊类设...
    99+
    2024-04-02
  • Java设计模式之原型设计示例详解
    目录简单说一下(定义)稍微夸一下(优缺点)顺便提一下(适用场景)着重讲一下(深、浅克隆)多多用一下(结构、代码实现)简单说一下(定义) 什么是原型模式:原型模式是用于创建重复的对象,...
    99+
    2024-04-02
  • Java设计模式之享元模式示例详解
    目录定义原理类图案例需求方案:享元模式分析总结定义 享元模式(FlyWeight Pattern),也叫蝇量模式,运用共享技术,有效的支持大量细粒度的对象,享元模式就是池技术的重要实...
    99+
    2024-04-02
  • Java设计模式之外观模式示例详解
    目录定义案例需求方案:外观模式实现分析总结定义 外观模式为多个复杂的子系统,提供了一个一致的界面,使得调用端只和这个接口发生调用,而无须关系这个子系统内部的细节 案例 需求 看电影的...
    99+
    2024-04-02
  • Java设计模式之策略模式示例详解
    目录定义结构UML类图UML序列图深入理解策略模式策略和上下文的关系策略模式在JDK中的应用该策略接口有四个实现类策略模式的优点策略模式的缺点策略模式的本质在讲策略模式之前,我们先看...
    99+
    2024-04-02
  • Java设计模式之访问者模式使用场景及代码示例
    Java设计模式访问者模式模式概念访问者模式表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。访问者模式适用于数据结构相对稳定算法又易变化的系统,若系统数据结构对象易于变化,则不适合使用...
    99+
    2023-05-30
    java 访问者模式 ava
  • C++示例讲解观察者设计模式
    目录引言什么是观察者设计模式解决的问题编程思路知识小百科引言 用来解决两个不相关对象之间的一对一或者一对多的通信模型。 什么是观察者设计模式 观察者模式是一种对象行为模式。它定义对象...
    99+
    2022-12-26
    C++观察者设计模式 C++观察者模式 C++设计模式
  • Java设计模式之建造者模式的示例详解
    目录定义案例需求方案一方案二对比分析总结建造者模式的优势:注意点 定义 建造者模式(Builder Pattern),又叫生成器模式,是一种对象构建模式 它可以将复杂对象的建造过程抽...
    99+
    2024-04-02
  • Java设计模式之适配器模式的示例详解
    目录定义分类案例需求方案一:类适配器方案二:对象适配器方案三:接口适配器对比分析方案一:类适配器方案二:对象适配器方案三:接口适配器总结 定义 适配器模式,即将某个类的接口转换成客户...
    99+
    2024-04-02
  • Java设计模式之责任链模式的示例详解
    目录应用场景实际代码案例无模式情况下的代码采用责任链模式优化代码采用建造者+责任链模式优化代码责任链模式优缺点责任链模式是将链中的每一个节点看做是一个对象,每个节点处理的请求均不相同...
    99+
    2022-11-13
    Java 设计模式 责任链模式 Java 责任链模式
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作