设计模式(c++)

ops/2024/10/21 0:20:31/

设计模式通常分为三大类:

  1. 创建型模式(Creational Patterns):负责对象创建的机制,主要解决对象创建过程中的复杂性和灵活性问题。

  2. 结构型模式(Structural Patterns):负责处理类或对象之间的关系,简化这些关系并提高代码的可复用性和维护性。

  3. 行为型模式(Behavioral Patterns):负责对象之间的通信和算法的行为,提供松耦合的方式进行对象间的交互。

下面对常见的设计模式做详细讲解。

创建型模式

  1. 单例模式(Singleton Pattern)

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

    • 适用场景:需要控制某个类的实例化次数,例如配置管理类、日志记录类。

    • 实现方式:通过私有化构造函数,提供一个静态方法获取唯一的实例。

    class Singleton {
    private:static Singleton* instance;Singleton() {}  // 私有化构造函数
    public:static Singleton* getInstance() {if (instance == nullptr) {instance = new Singleton();}return instance;}
    };
  2. 工厂模式(Factory Pattern)

    • 定义:定义一个接口用于创建对象,但让子类决定实例化哪个类。

    • 适用场景:对象创建逻辑复杂,需要多种类型对象时。

    • 实现方式:将对象的创建逻辑封装在工厂类中。

    class Product {
    public:virtual void use() = 0;
    };
    ​
    class ConcreteProductA : public Product {
    public:void use() override { cout << "使用产品A" << endl; }
    };
    ​
    class ConcreteProductB : public Product {
    public:void use() override { cout << "使用产品B" << endl; }
    };
    ​
    class Factory {
    public:static Product* createProduct(char type) {if (type == 'A') return new ConcreteProductA();if (type == 'B') return new ConcreteProductB();return nullptr;}
    };
  3. 抽象工厂模式(Abstract Factory Pattern)

    • 定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定具体的类。

    • 适用场景:需要生产一系列相关产品时(如 UI 组件库)。

    • 实现方式:通过工厂类创建多个产品家族。

    class Button {
    public:virtual void render() = 0;
    };
    ​
    class MacButton : public Button {
    public:void render() override { cout << "Mac按钮" << endl; }
    };
    ​
    class WindowsButton : public Button {
    public:void render() override { cout << "Windows按钮" << endl; }
    };
    ​
    class GUIFactory {
    public:virtual Button* createButton() = 0;
    };
    ​
    class MacFactory : public GUIFactory {
    public:Button* createButton() override { return new MacButton(); }
    };
    ​
    class WindowsFactory : public GUIFactory {
    public:Button* createButton() override { return new WindowsButton(); }
    };

结构型模式

  1. 适配器模式(Adapter Pattern)

    • 定义:将一个类的接口转换为客户希望的另一个接口,适配器模式使得原本接口不兼容的类可以协同工作。

    • 适用场景:需要整合现有类的功能,但接口不一致时。

    • 实现方式:定义一个适配器类,继承或组合需要适配的类,并实现目标接口。

    class Target {
    public:virtual void request() = 0;
    };
    ​
    class Adaptee {
    public:void specificRequest() { cout << "特殊请求" << endl; }
    };
    ​
    class Adapter : public Target {
    private:Adaptee* adaptee;
    public:Adapter(Adaptee* a) : adaptee(a) {}void request() override { adaptee->specificRequest(); }
    };
  2. 代理模式(Proxy Pattern)

    • 定义:为另一个对象提供一种代理,以控制对该对象的访问。

    • 适用场景:需要控制或延迟访问某个对象时(如远程代理、虚拟代理)。

    • 实现方式:代理类持有被代理类的实例,并控制访问。

    class Subject {
    public:virtual void request() = 0;
    };
    ​
    class RealSubject : public Subject {
    public:void request() override { cout << "真实请求" << endl; }
    };
    ​
    class Proxy : public Subject {
    private:RealSubject* realSubject;
    public:void request() override {if (!realSubject) realSubject = new RealSubject();realSubject->request();}
    };
  3. 装饰者模式(Decorator Pattern)

    • 定义:动态地给对象添加额外的功能。

    • 适用场景:需要在不改变类定义的情况下增强对象功能时。

    • 实现方式:通过组合对象,将装饰功能附加到被装饰对象上。

    class Component {
    public:virtual void operation() = 0;
    };
    ​
    class ConcreteComponent : public Component {
    public:void operation() override { cout << "基本操作" << endl; }
    };
    ​
    class Decorator : public Component {
    protected:Component* component;
    public:Decorator(Component* c) : component(c) {}void operation() override { component->operation(); }
    };
    ​
    class ConcreteDecorator : public Decorator {
    public:ConcreteDecorator(Component* c) : Decorator(c) {}void operation() override {Decorator::operation();cout << "附加操作" << endl;}
    };

行为型模式

  1. 观察者模式(Observer Pattern)

    • 定义:定义对象间的一对多依赖,当一个对象改变状态时,所有依赖于它的对象都会得到通知并自动更新。

    • 适用场景:当一个对象的状态变化需要通知多个对象时(如事件系统)。

    • 实现方式:定义主题和观察者接口,主题保存观察者列表,并在状态改变时通知它们。

    class Observer {
    public:virtual void update() = 0;
    };
    ​
    class Subject {
    private:vector<Observer*> observers;
    public:void attach(Observer* observer) { observers.push_back(observer); }void notify() {for (auto* observer : observers) {observer->update();}}
    };
    ​
    class ConcreteObserver : public Observer {
    public:void update() override { cout << "收到更新通知" << endl; }
    };
  2. 状态模式(State Pattern)

    • 定义:允许对象在内部状态发生改变时改变其行为,对象看起来像是改变了其类。

    • 适用场景:对象的行为依赖于状态,并且状态之间可以相互转换时(如状态机、交易状态)。

    • 实现方式:将不同的状态封装成独立的类,通过状态类处理相应的逻辑。

    class State {
    public:virtual void handle() = 0;
    };
    ​
    class ConcreteStateA : public State {
    public:void handle() override { cout << "处理状态A" << endl; }
    };
    ​
    class ConcreteStateB : public State {
    public:void handle() override { cout << "处理状态B" << endl; }
    };
    ​
    class Context {
    private:State* state;
    public:Context(State* s) : state(s) {}void setState(State* s) { state = s; }void request() { state->handle(); }
    };

总结

设计模式通过定义抽象的结构和行为来解决具体的开发问题。它们可以提高代码的可复用性、灵活性和可维护性。合理运用设计模式能使代码更加简洁、易读和易扩展。


http://www.ppmy.cn/ops/127123.html

相关文章

PythonExcel批量pingIP地址

问题&#xff1a; 作为一个电气工程师&#xff08;PLC&#xff09;&#xff0c;当设备掉线的时候&#xff0c;需要用ping工具来检查网线物理层是否可靠连接&#xff0c;当项目体量过大时&#xff0c;就不能一个手动输入命令了。 解决方案一&#xff1a; 使用CMD命令 for /L %…

第6篇:无线与移动网络

目录 引言 6.1 无线网络的基础概念 6.2 无线局域网&#xff08;WLAN&#xff09;与IEEE 802.11 6.3 蓝牙与无线个域网&#xff08;WPAN&#xff09; 6.4 无线城域网&#xff08;WMAN&#xff09;与WiMax 6.5 ZigBee与智能家居 6.6 移动蜂窝网络&#xff08;3G/4G/5G&…

探索 Python 中的 XML 转换利器:xml2dict

文章目录 **探索 Python 中的 XML 转换利器&#xff1a;xml2dict**一、背景介绍二、xml2dict 是什么&#xff1f;三、如何安装 xml2dict&#xff1f;四、基本用法五、实际应用场景六、常见问题及解决方案七、总结 探索 Python 中的 XML 转换利器&#xff1a;xml2dict 一、背景…

【redis】redis的多线程和IO多路复用

【redis】redis的多线程和IO多路复用 【一】前言【二】Redis单线程和多线程问题的背景【1】Redis的单线程【2】Redis为什么选择单线程&#xff1f;【3】Redis为什么开始利用多核&#xff1f;【4】Redis当前的性能瓶颈【5】Redis的主线程如何和IO线程协同 【三】IO多路复用的理解…

如何进行数据库缩容 | OceanBase应用实践

作者&#xff1a;关炳文&#xff0c;爱可生 DBA 团队成员&#xff0c;负责数据库相关技术支持。 本文详细介绍了OceanBase V3.2版的集群中&#xff0c;面对数据文件缩容的场景的一套缩容方案&#xff0c;作为大家的参考。 缩容场景 某银行运行的一套采用1-1-1架构的OceanBase…

【str_replace替换导致的绕过】

双写绕过 随便输入一个 usernameadmin&passwords 没有回显测试注入点 usernameadmin or 11%23&passwords 回显hello admin测试列数 usernameadmin order by 3%23&passwords测试回显位 usernameadmi union select 1,2,3%23&passwords 没有显示数据&#xff0c;推…

全网免费的文献调研方法以及获取外网最新论文、代码和翻译pdf论文的方法(适用于硕士、博士、科研)

1. 文献调研 学术搜索引擎(十分推荐前三个&#xff0c;超有用)&#xff1a;使用 Google Scholar(https://scholar.google.com/)(https://scholar.google.com.tw/)(巨人学术搜索‬‬)、&#xff08;三个都可以&#xff0c;镜像网站&#xff09; arXiv(https://arxiv.org/)、&am…

C++反汇编逆向还原——数组与循环还原练习(笔记)

c反汇编逆向还原代码&#xff0c;数组元素的获取、初始化、循环的实现&#xff0c;shl指令、数组的初始化、元素的选取的汇编还原是本次笔记的重点 一、汇编 流程图片太大&#xff0c;所以分成两部分 本次用到的指令 mov &#xff1a;将源操作数复制到目的操作数 lea &#x…