装饰器模式通过组合动态扩展对象功能,避免继承导致的类爆炸,适用于C++中需灵活添加职责的场景。

在C++中实现装饰器模式,可以灵活地在运行时动态添加对象功能,而不改变原有类的结构。这种设计模式属于结构型模式,核心思想是通过组合的方式,为对象添加新行为,避免使用继承带来的类爆炸问题。
装饰器模式的基本结构
装饰器模式包含以下几个关键角色:
- Component(组件):定义对象接口,可以是抽象类或接口,声明了具体对象和装饰器共同遵循的操作。
- ConcreteComponent(具体组件):实际被装饰的对象,实现了Component接口。
- Decorator(装饰器基类):持有一个Component对象的引用,并实现与Component相同的接口,可以在子类中扩展功能。
- ConcreteDecorator(具体装饰器):向组件添加职责,比如日志、权限检查、缓存等。
代码示例:动态添加功能
以下是一个简单的C++示例,展示如何通过装饰器模式为一个文本显示功能动态添加边框和滚动条:
// 组件接口 class Display { public: virtual ~Display() = default; virtual void show() = 0; };
// 具体组件:基础文本显示 class TextDisplay : public Display { std::string text; public: explicit TextDisplay(const std::string& t) : text(t) {} void show() override { std::cout
// 装饰器基类 class DisplayDecorator : public Display { protected: Display display; public: explicit DisplayDecorator(Display d) : display(d) {} void show() override { display->show(); } };
// 具体装饰器:添加边框 class BorderDecorator : public DisplayDecorator { public: explicit BorderDecorator(Display* d) : DisplayDecorator(d) {} void show() override { std::cout
// 具体装饰器:添加滚动条 class ScrollDecorator : public DisplayDecorator { public: explicit ScrollDecorator(Display* d) : DisplayDecorator(d) {} void show() override { std::cout
使用方式:
立即学习“C++免费学习笔记(深入)”;
int main() { Display* display = new TextDisplay("Hello World");display = new BorderDecorator(display); // 添加边框 display = new ScrollDecorator(display); // 添加滚动条 display->show(); // 输出:↑[Hello World]↓ delete display; // 注意:实际中应使用智能指针管理内存 return 0;
}
CNdian单页面淘宝客程序第一次安装,直接上传到.net2.0空间就能运行。 CNdian单页面淘宝客程序主要功能: 1、url重写(伪静态aspx) 2、模板动态修改 3、带文章系统并带hmtl编辑器 4、seo优化(rss,网站地图) 5、商品手动添加灵活性(非api) 6、广告动态化添加 7、友情链接交换 8、数据包备份功能 CNdian单页面淘宝客程序升级安装以下文件不要上传App_Da
优点与适用场景
装饰器模式的优势在于:
- 动态扩展功能:可以在运行时按需组合功能,比静态继承更灵活。
- 符合开闭原则:扩展新功能无需修改原有代码,只需添加新的装饰器类。
- 避免类爆炸:比如有3种功能,用继承需要 2^3=8 个子类,而装饰器只需3个装饰类加1个基础类。
常见应用场景包括:I/O流处理、GUI组件增强、日志记录、权限控制等需要逐层添加行为的场合。
使用时注意内存管理,建议结合智能指针(如std::unique_ptr)避免内存泄漏。
基本上就这些。







