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

装饰器模式在C++中用于在不修改原有类的前提下,动态地给对象添加新功能。相比继承,它更灵活,支持运行时组合功能,适合需要多变行为的场景。核心是通过组合而非继承扩展功能。
基本结构设计
装饰器模式包含以下几个角色:
- Component(组件接口):定义对象的统一接口,被装饰对象和装饰器都实现此接口
- ConcreteComponent(具体组件):原始对象,功能可被扩展
- Decorator(装饰器基类):持有Component指针,转发请求到被装饰对象
- ConcreteDecorator(具体装饰器):在转发前后添加新行为
代码实现示例
以“消息发送”为例,基础功能是发送文本,后续可动态添加加密、压缩等功能:
#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++中结合智能指针和接口设计,能写出既安全又清晰的装饰结构。










