Qt C++设计模式->装饰器模式

news/2024/9/29 3:22:11/

装饰器模式(Decorator Pattern)是一种结构型设计模式,允许你在不改变对象接口的情况下,动态地为对象添加额外的功能。它通过将对象包装在装饰器类中来实现这一点,从而提供了比继承更灵活的扩展方式。

装饰器模式的应用场景

装饰器模式非常适合用于需要动态添加功能的场景,例如在GUI框架中,可以为窗口、按钮等组件添加不同的行为或样式。在Qt中,装饰器模式常用于图形界面中,为控件添加边框、背景色或其他视觉效果。

装饰器模式示例代码

#include <QDebug>
#include <QString>// 抽象组件类
class Coffee {
public:virtual QString getDescription() const = 0; // 获取描述virtual double cost() const = 0;             // 获取价格virtual ~Coffee() = default;
};// 具体组件类:基本咖啡
class SimpleCoffee : public Coffee {
public:QString getDescription() const override {return "Simple Coffee";}double cost() const override {return 2.0; // 基本咖啡的价格}
};// 抽象装饰器类
class CoffeeDecorator : public Coffee {
protected:Coffee* coffee; // 被装饰的咖啡public:CoffeeDecorator(Coffee* coffee) : coffee(coffee) {}
};// 具体装饰器类:牛奶装饰
class MilkDecorator : public CoffeeDecorator {
public:MilkDecorator(Coffee* coffee) : CoffeeDecorator(coffee) {}QString getDescription() const override {return coffee->getDescription() + ", Milk"; // 添加牛奶描述}double cost() const override {return coffee->cost() + 0.5; // 牛奶附加费用}
};// 具体装饰器类:糖装饰
class SugarDecorator : public CoffeeDecorator {
public:SugarDecorator(Coffee* coffee) : CoffeeDecorator(coffee) {}QString getDescription() const override {return coffee->getDescription() + ", Sugar"; // 添加糖描述}double cost() const override {return coffee->cost() + 0.2; // 糖附加费用}
};// 使用示例
int main() {Coffee* coffee = new SimpleCoffee(); // 创建基本咖啡// 添加牛奶装饰Coffee* milkCoffee = new MilkDecorator(coffee);qDebug() << milkCoffee->getDescription() << "cost:" << milkCoffee->cost();// 添加糖装饰Coffee* sugarMilkCoffee = new SugarDecorator(milkCoffee);qDebug() << sugarMilkCoffee->getDescription() << "cost:" << sugarMilkCoffee->cost();// 清理内存delete sugarMilkCoffee;delete milkCoffee; // 自动清理basic coffeedelete coffee;return 0;
}

代码解析

  • Coffee类:抽象组件类,定义了基本咖啡的接口,提供描述和价格的方法。

  • SimpleCoffee类:具体组件类,表示基本咖啡,实现了描述和价格方法。

  • CoffeeDecorator类:抽象装饰器类,持有一个Coffee对象,提供基本的装饰功能。

  • MilkDecorator和SugarDecorator类:具体装饰器类,分别为咖啡添加牛奶和糖的功能,重写了描述和价格方法。

装饰器模式的优点

  • 灵活性:可以动态地添加或删除功能,而无需修改原有代码。

  • 透明性:客户代码只需要处理组件接口,而不需要了解装饰的实现。

  • 组合性:可以通过多个装饰器组合来实现复杂的功能。

装饰器模式的缺点

  • 复杂性:使用装饰器可能导致系统中出现大量的小类,增加系统复杂性。

  • 调试困难:由于多个装饰器的组合,调试时可能比较复杂。

适合使用装饰器模式的情况

  • 需要在运行时动态地给对象添加功能时。

  • 需要避免使用大量的子类来实现功能的组合时。

通过装饰器模式,Qt应用程序可以灵活地扩展UI组件的功能,提供更加丰富的用户体验。


http://www.ppmy.cn/news/1530839.html

相关文章

代码随想录算法训练营第29天 | 第九章动态规划 part02

第九章 动态规划 Part 02 文章目录 第九章 动态规划 Part 02详细布置62. 不同路径63. 不同路径 II343. 整数拆分&#xff08;可跳过&#xff09;96. 不同的二叉搜索树&#xff08;可跳过&#xff09; 今天开始逐渐有了动态规划的感觉了。前两题 不同路径非常适合进阶&#xff…

Gnu Radio抓取WiFi信号,流程图中模块功能

模块流程如图所示&#xff1a; GNURadio中抓取WiFi信号的流程图中各个模块的功能&#xff1a; UHD: USRP Source&#xff1a; 使用此模块配置USRP硬件进行信号采集。设置频率、增益、采样率等参数。Complex to Mag^2&#xff1a; 将复数IQ数据转换为幅度的平方。Delay&#xf…

OpenCV第九章——图形检测

1.图像的轮廓 轮廓是指图形或物体的外边缘线条&#xff0c;简单的几何图形是由平滑的线构成的容易识别&#xff0c;但不规则图形的轮廓由许多个点构成&#xff0c;识别起来比较困难。Opencv提供了findContours()方法来判断图像的边缘&#xff0c;之后将边缘的点封装成数…

神经网络构建原理(以MINIST为例)

神经网络构建原理(以MINIST为例) 在 MNIST 手写数字识别任务中&#xff0c;构建神经网络并训练模型来进行分类是经典的深度学习应用。MNIST 数据集包含 28x28 像素的手写数字图像&#xff08;0-9&#xff09;&#xff0c;任务是构建一个神经网络&#xff0c;能够根据输入的图像…

如何使用numpy反转数组

如何使用numpy反转数组 1、使用np.flip()函数 可以使用flip(m, axisNone)函数来对数组进行反转&#xff1a; m:输入数组 axis:为None则行列都反转 axis:为0则反转行 axis:为1则反转列2、代码 import numpy as np# 创建一维数组 arr np.array([[1, 2, 3, 4, 5],[2, 2, 3, 4…

深度学习(6):Dataset 和 DataLoader

文章目录 Dataset 类DataLoader 类 Dataset 类 概念&#xff1a; Dataset 是一个抽象类&#xff0c;用于表示数据集。它定义了如何获取数据集中的单个样本和标签。 作用&#xff1a; 为数据集提供统一的接口&#xff0c;便于数据的读取、预处理和管理。 关键方法&#xff…

Linux部署python web项目Flask + gunicorn + nginx

文章目录 一、安装python&使用虚拟环境二、python程序重要参数加密2.1 非对称加密&#xff08;RSA&#xff09;2.2 生成密钥对2.4 以连接数据库参数加密为例2.4.1 工具类RSA.py 三、一个简单的Flask项目四、安装配置gunicorn4.1 安装4.2 启动/配置(选择eventlet)4.2.1 命令…

网络爬虫到底难在哪里?

如果你是自己做爬虫脚本开发&#xff0c;那确实难&#xff0c;因为你需要掌握Python、HTML、JS、xpath、database等技术&#xff0c;而且还要处理反爬、动态网页、逆向等情况&#xff0c;不然压根不知道怎么去写代码&#xff0c;这些技术和经验储备起码得要个三五年。 比如这几…