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

装饰器模式在C++中用于在不修改原有类的前提下,动态地给对象添加新功能。相比继承,它更灵活,支持运行时组合功能,适合需要多变行为的场景。核心是通过组合而非继承扩展功能。
基本结构设计
装饰器模式包含以下几个角色:
- Component(组件接口):定义对象的统一接口,被装饰对象和装饰器都实现此接口
- ConcreteComponent(具体组件):原始对象,功能可被扩展
- Decorator(装饰器基类):持有Component指针,转发请求到被装饰对象
- ConcreteDecorator(具体装饰器):在转发前后添加新行为
代码实现示例
以“消息发送”为例,基础功能是发送文本,后续可动态添加加密、压缩等功能:
#include#include #include // 组件接口 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 sender; public: explicit SenderDecorator(std::shared_ptr 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++免费学习笔记(深入)”;
网趣购物系统静态版支持网站一键静态生成,采用动态进度条模式生成静态,生成过程更加清晰明确,商品管理上增加淘宝数据包导入功能,与淘宝数据同步更新!采用领先的AJAX+XML相融技术,速度更快更高效!系统进行了大量的实用性更新,如优化核心算法、增加商品图片批量上传、谷歌地图浏览插入等,静态版独特的生成算法技术使静态生成过程可随意掌控,从而可以大大减轻服务器的负担,结合多种强大的SEO优化方式于一体,使
int main() {
auto basic = std::make_shared();
// 只加密
auto encrypted = std::make_shared(basic);
std::cout << encrypted->send() << "\n";
// 输出:加密(原始消息)
// 先压缩再加密
auto compressed = std::make_shared(basic);
auto encryptedCompressed = std::make_shared(compressed);
std::cout << encryptedCompressed->send() << "\n";
// 输出:加密(压缩(原始消息))
return 0;
}
这种方式避免了类爆炸问题。比如有3种功能,继承方式可能需要8个子类,而装饰器只需3个装饰类加1个基础类。
关键注意事项
使用装饰器模式时注意以下几点:
- 装饰器和被装饰对象应继承同一接口,保证透明性
- 注意装饰顺序,不同顺序可能影响最终结果
- 使用智能指针管理生命周期,避免内存泄漏
- 若功能之间有依赖关系,需在文档中明确说明
基本上就这些。装饰器模式让功能扩展变得像搭积木一样简单,适合需要灵活组合行为的场景。C++中结合智能指针和接口设计,能写出既安全又清晰的装饰结构。









