常用的设计模式,以及c++代码简答示例

embedded/2024/10/15 15:45:16/

常用的设计模式及其 C++ 简短示例:


1. 单例模式(Singleton Pattern)

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

示例代码

class Singleton {
private:static Singleton* instance;Singleton() {} // 构造函数私有化public:static Singleton* getInstance() {if (instance == nullptr)instance = new Singleton();return instance;}
};// 初始化静态成员
Singleton* Singleton::instance = nullptr;

2. 工厂方法模式(Factory Method Pattern)

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

示例代码

class Product {
public:virtual void use() = 0;
};class ConcreteProductA : public Product {
public:void use() override { /* 实现 A */ }
};class ConcreteProductB : public Product {
public:void use() override { /* 实现 B */ }
};class Factory {
public:virtual Product* createProduct() = 0;
};class ConcreteFactoryA : public Factory {
public:Product* createProduct() override {return new ConcreteProductA();}
};class ConcreteFactoryB : public Factory {
public:Product* createProduct() override {return new ConcreteProductB();}
};

3. 抽象工厂模式(Abstract Factory Pattern)

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

示例代码

class AbstractProductA {
public:virtual void use() = 0;
};class AbstractProductB {
public:virtual void eat() = 0;
};class ConcreteProductA1 : public AbstractProductA {
public:void use() override { /* 实现 A1 */ }
};class ConcreteProductB1 : public AbstractProductB {
public:void eat() override { /* 实现 B1 */ }
};class AbstractFactory {
public:virtual AbstractProductA* createProductA() = 0;virtual AbstractProductB* createProductB() = 0;
};class ConcreteFactory1 : public AbstractFactory {
public:AbstractProductA* createProductA() override {return new ConcreteProductA1();}AbstractProductB* createProductB() override {return new ConcreteProductB1();}
};

4. 建造者模式(Builder Pattern)

作用:将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。

示例代码

class Product {
public:void setPartA(int value) { /* 设置部件 A */ }void setPartB(int value) { /* 设置部件 B */ }
};class Builder {
public:virtual void buildPartA() = 0;virtual void buildPartB() = 0;virtual Product* getResult() = 0;
};class ConcreteBuilder : public Builder {
private:Product* product = new Product();public:void buildPartA() override {product->setPartA(1);}void buildPartB() override {product->setPartB(2);}Product* getResult() override {return product;}
};class Director {
public:void construct(Builder* builder) {builder->buildPartA();builder->buildPartB();}
};

5. 适配器模式(Adapter Pattern)

作用:将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。

示例代码

class Target {
public:virtual void request() = 0;
};class Adaptee {
public:void specificRequest() { /* 特定请求 */ }
};class Adapter : public Target {
private:Adaptee* adaptee;public:Adapter(Adaptee* a) : adaptee(a) {}void request() override {adaptee->specificRequest();}
};

6. 装饰者模式(Decorator Pattern)

作用:动态地给一个对象添加一些额外的职责。

示例代码

class Component {
public:virtual void operation() = 0;
};class ConcreteComponent : public Component {
public:void operation() override { /* 基础操作 */ }
};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();addedBehavior();}void addedBehavior() { /* 添加的行为 */ }
};

7. 观察者模式(Observer Pattern)

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

示例代码

#include <vector>class Observer {
public:virtual void update() = 0;
};class Subject {
private:std::vector<Observer*> observers;public:void attach(Observer* o) { observers.push_back(o); }void notify() {for (Observer* o : observers)o->update();}
};class ConcreteObserver : public Observer {
public:void update() override { /* 更新逻辑 */ }
};

8. 策略模式(Strategy Pattern)

作用:定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。

示例代码

class Strategy {
public:virtual void algorithmInterface() = 0;
};class ConcreteStrategyA : public Strategy {
public:void algorithmInterface() override { /* 算法 A */ }
};class ConcreteStrategyB : public Strategy {
public:void algorithmInterface() override { /* 算法 B */ }
};class Context {
private:Strategy* strategy;public:Context(Strategy* s) : strategy(s) {}void contextInterface() {strategy->algorithmInterface();}
};

9. 模板方法模式(Template Method Pattern)

作用:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。

示例代码

class AbstractClass {
public:void templateMethod() {primitiveOperation1();primitiveOperation2();}virtual void primitiveOperation1() = 0;virtual void primitiveOperation2() = 0;
};class ConcreteClass : public AbstractClass {
public:void primitiveOperation1() override { /* 实现 1 */ }void primitiveOperation2() override { /* 实现 2 */ }
};

10. 命令模式(Command Pattern)

作用:将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化。

示例代码

class Command {
public:virtual void execute() = 0;
};class Receiver {
public:void action() { /* 实际操作 */ }
};class ConcreteCommand : public Command {
private:Receiver* receiver;public:ConcreteCommand(Receiver* r) : receiver(r) {}void execute() override {receiver->action();}
};class Invoker {
private:Command* command;public:void setCommand(Command* c) { command = c; }void invoke() { command->execute(); }
};

这些设计模式在软件开发中具有广泛的应用,能够提高代码的可维护性、可扩展性和重用性。根据具体需求选择合适的设计模式,可以使程序设计更加优雅和高效。


http://www.ppmy.cn/embedded/127936.html

相关文章

MFC的.rc 和.rc2文件【常见问题】

目录 一、介绍 .rc 文件 .rc2 文件 使用上的建议 二、实例 工程截图 rc文件 rc2文件 注意&#xff1a; 三、使用 能否删除&#xff1f; 一、介绍 在MFC项目中&#xff0c;.rc和.rc2文件都是资源脚本文件&#xff0c;但它们有不同的用途和管理方式。它们两指向的是同…

重学SpringBoot3-集成Redis(九)之共享Session

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成Redis&#xff08;九&#xff09;之共享Session 1. 为什么需要 Session 共享2. Spring Session 和 Redis 的集成2.1. 引入依赖2.2. 配置 Redis 连接…

Python脚本实现发送QQ邮件

需要发件人邮箱地址、授权码和收件人邮箱地址 1、登录QQ邮箱后台&#xff0c;点击右上角设置&#xff0c;下拉找到第三方服务&#xff0c;开启SMTP服务&#xff0c;复制生成的授权码 2、新建一个python文件&#xff0c;输入以下源码&#xff0c;更替参数后运行即可 import smt…

<Rust>iced库(0.13.1)学习之部件(三十二):使用markdown部件来编辑md文档

前言 本专栏是学习Rust的GUI库iced的合集,将介绍iced涉及的各个小部件分别介绍,最后会汇总为一个总的程序。 iced是RustGUI中比较强大的一个,目前处于发展中(即版本可能会改变),本专栏基于版本0.12.1. 注:新版本已更新为0.13 概述 这是本专栏的第三十二篇,主要介绍一…

WebGl 如何给页面绑定点击事件

在WebGL中给页面绑定点击事件&#xff0c;可以通过为WebGL的绘图上下文所在的<canvas>元素添加事件监听器来实现点击事件的处理。 1. 画布添加点击事件 const ctx document.getElementById(canvas) const gl ctx.getContext(webgl)ctx.onclick function (e) {// 给ca…

如何获取网页内嵌入的视频?

如何获取网页内嵌入的视频&#xff1f; 有时插件无法识别的视频资源&#xff0c;可以通过手动使用浏览器的开发者工具来抓取。你可以按照以下步骤操作&#xff1a; 步骤&#xff1a; 打开网页并按 F12&#xff1a;在视频页面按下 F12 或右键点击网页并选择“检查”或“Inspe…

Spring Boot 进阶-Spring Boot如何整合AOP实现自定义注解

通过之前的文章,我们知道在Spring Boot中使用了大量的注解,而对于注解大家应该不陌生。 Java注解是在JDK1.5的时候引入的新特性,它提供了一种类似注释的机制,用来将任何的信息或者元数据与类、方法,或者是成员变量来进行关联。在注解中附带了一些信息,这些信息可以在编译…

QT文件操作【记事本】

mainwindow.h核心函数 QFileDialog::getOpenFileName()QFileDialog::getSaveFileName() #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include<QFileDialog> #include<QMessageBox> #include<QDebug> #include<QFile> #…