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

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

装饰器模式的应用场景

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

装饰器模式示例代码

cpp 复制代码
#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 coffee
    delete coffee;

    return 0;
}

代码解析

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

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

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

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

装饰器模式的优点

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

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

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

装饰器模式的缺点

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

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

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

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

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

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

相关推荐
Rsun0455112 分钟前
设计模式应该怎么学
java·开发语言·设计模式
Tanecious.22 分钟前
蓝桥杯备赛:Day3-P1918 保龄球
c++·蓝桥杯
良木生香29 分钟前
【C++初阶】:C++类和对象(下):构造函数promax & 类型转换 & static & 友元 & 内部类 & 匿名对象 & 超级优化
c语言·开发语言·c++
三雷科技1 小时前
使用 `dlopen` 动态加载 `.so` 文件
开发语言·c++·算法
旖-旎2 小时前
分治(快速选择算法)(3)
c++·算法·leetcode·排序算法·快速选择
_MyFavorite_2 小时前
JAVA重点基础、进阶知识及易错点总结(31)设计模式基础(单例、工厂)
java·开发语言·设计模式
xiaoye-duck3 小时前
【C++:哈希表封装】哈希表封装 myunordered_map/myunordered_set 实战:底层原理 + 完整实现
数据结构·c++·散列表
A.A呐3 小时前
【C++第二十三章】C++11
开发语言·c++
亿秒签到3 小时前
L2-007 家庭房产
数据结构·c++·算法
2401_892070984 小时前
【Linux C++ 日志系统实战】日志消息对象 LogMessage 完整实现:流式拼装 + 标准化输出
linux·c++·日志系统·流式日志