装饰器模式通过组合而非继承动态扩展功能,核心角色包括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++免费学习笔记(深入)”;
int main() { auto basic = std::make_shared(); // 只加密 auto encrypted = std::make_shared(basic); std::cout <send() << "n"; // 输出:加密(原始消息) // 先压缩再加密 auto compressed = std::make_shared(basic); auto encryptedCompressed = std::make_shared(compressed); std::cout <send() << "n"; // 输出:加密(压缩(原始消息)) return 0;}
这种方式避免了类爆炸问题。比如有3种功能,继承方式可能需要8个子类,而装饰器只需3个装饰类加1个基础类。
关键注意事项
使用装饰器模式时注意以下几点:
装饰器和被装饰对象应继承同一接口,保证透明性 注意装饰顺序,不同顺序可能影响最终结果 使用智能指针管理生命周期,避免内存泄漏 若功能之间有依赖关系,需在文档中明确说明
基本上就这些。装饰器模式让功能扩展变得像搭积木一样简单,适合需要灵活组合行为的场景。C++中结合智能指针和接口设计,能写出既安全又清晰的装饰结构。
以上就是C++装饰器模式实现 动态添加功能方法的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1472014.html
微信扫一扫
支付宝扫一扫