装饰器模式通过组合而非继承动态扩展功能,核心角色包括Component、ConcreteComponent、Decorator和ConcreteDecorator,以消息发送为例实现加密、压缩等功能的灵活组合,避免类爆炸问题,结合智能指针管理生命周期,确保透明性和安全性,适合多变行为场景。

装饰器模式在C++中用于在不修改原有类的前提下,动态地给对象添加新功能。相比继承,它更灵活,支持运行时组合功能,适合需要多变行为的场景。核心是通过组合而非继承扩展功能。
装饰器模式包含以下几个角色:
以“消息发送”为例,基础功能是发送文本,后续可动态添加加密、压缩等功能:
#include <iostream>
#include <string>
#include <memory>
// 组件接口
class MessageSender {
public:
virtual ~MessageSender() = default;
virtual std::string send() = 0;
};
// 具体组件:基础发送器
class BasicSender : public MessageSender {
public:
std::string send() override {
return "原始消息";
}
};
// 装饰器基类
class SenderDecorator : public MessageSender {
protected:
std::shared_ptr<MessageSender> sender;
public:
explicit SenderDecorator(std::shared_ptr<MessageSender> s) : sender(s) {}
virtual std::string send() override {
return sender->send();
}
};
// 具体装饰器:加密
class EncryptedSender : public SenderDecorator {
public:
using SenderDecorator::SenderDecorator;
std::string send() override {
std::string msg = SenderDecorator::send();
return "加密(" + msg + ")";
}
};
// 具体装饰器:压缩
class CompressedSender : public SenderDecorator {
public:
using SenderDecorator::SenderDecorator;
std::string send() override {
std::string msg = SenderDecorator::send();
return "压缩(" + msg + ")";
}
};
可以在运行时灵活组合功能:
立即学习“C++免费学习笔记(深入)”;
int main() {
auto basic = std::make_shared<BasicSender>();
// 只加密
auto encrypted = std::make_shared<EncryptedSender>(basic);
std::cout << encrypted->send() << "\n";
// 输出:加密(原始消息)
// 先压缩再加密
auto compressed = std::make_shared<CompressedSender>(basic);
auto encryptedCompressed = std::make_shared<EncryptedSender>(compressed);
std::cout << encryptedCompressed->send() << "\n";
// 输出:加密(压缩(原始消息))
return 0;
}
这种方式避免了类爆炸问题。比如有3种功能,继承方式可能需要8个子类,而装饰器只需3个装饰类加1个基础类。
使用装饰器模式时注意以下几点:
基本上就这些。装饰器模式让功能扩展变得像搭积木一样简单,适合需要灵活组合行为的场景。C++中结合智能指针和接口设计,能写出既安全又清晰的装饰结构。
以上就是C++装饰器模式实现 动态添加功能方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号