模式特点
动态地给一个对象添加额外的职责。装饰器模式比子类继承更加灵活,可以在运行时组合各种功能。
- 装饰器和被装饰对象实现同一接口
- 装饰器包裹被装饰对象,增强其功能
- 可以多层嵌套装饰,灵活组合功能
- 比继承更灵活,避免类爆炸
类图
应用场景
- Qt 中 QIODevice 的分层:QFile → QBuffer → 自定义加密层
- IO 流处理:缓冲、压缩、加密层层装饰
- 日志系统:基础日志 → 时间戳装饰 → 格式化装饰
- UI 控件增强:滚动条装饰、边框装饰、阴影装饰
- 权限控制:基础请求 → 认证装饰 → 日志装饰 → 限流装饰
示例代码(C++)
// 组件接口 class DataSource { public: virtual void writeData(const std::string& data) = 0; virtual ~DataSource() = default; }; // 具体组件 class FileDataSource : public DataSource { public: void writeData(const std::string& data) override { std::cout << "写入文件: " << data << std::endl; }}; // 装饰器基类 class DataSourceDecorator : public DataSource { protected: DataSource* m_wrappee; public: DataSourceDecorator(DataSource* ds) : m_wrappee(ds) {} void writeData(const std::string& data) override { m_wrappee->writeData(data); } }; // 加密装饰器 class EncryptionDecorator : public DataSourceDecorator { public: EncryptionDecorator(DataSource* ds) : DataSourceDecorator(ds) {} void writeData(const std::string& data) override { std::string encrypted = "[ENC]" + data; // 模拟加密 m_wrappee->writeData(encrypted); } }; // 使用:灵活组合多层装饰 DataSource* ds = new EncryptionDecorator( new FileDataSource() ); ds->writeData("敏感数据"); // 先加密再写入