装饰器模式通过组合扩展对象功能,避免类爆炸。核心为组件接口、具体组件、装饰器基类与具体装饰器,支持运行时动态叠加行为,如日志与权限检查,灵活且符合开闭原则。

装饰器模式在C++中是一种结构型设计模式,用于在不修改原有类的前提下,动态地给对象添加新的行为。相比继承,它更灵活,避免了类爆炸问题,特别适合需要在运行时组合功能的场景。
装饰器模式核心思想
通过组合而非继承来扩展功能。装饰器类持有被装饰对象的实例,对外提供与原对象相同的接口,在调用前后可以添加额外逻辑。
关键点:
- 抽象组件(Component)定义接口
- 具体组件(ConcreteComponent)实现基础功能
- 装饰器基类(Decorator)继承组件接口,包含组件指针
- 具体装饰器(ConcreteDecorator)添加新行为
基本实现结构
#include#include // 抽象组件 class Component { public: virtual ~Component() = default; virtual void operation() const = 0; }; // 具体组件 class ConcreteComponent : public Component { public: void operation() const override { std::cout << "基础功能执行\n"; } }; // 装饰器基类 class Decorator : public Component { protected: std::shared_ptr component_; public: explicit Decorator(std::shared_ptr comp) : component_(comp) {} void operation() const override { component_->operation(); } }; // 具体装饰器A:添加日志 class LoggingDecorator : public Decorator { public: using Decorator::Decorator; void operation() const override { std::cout << "[日志] 开始执行操作\n"; Decorator::operation(); std::cout << "[日志] 操作完成\n"; } }; // 具体装饰器B:添加权限检查 class SecurityDecorator : public Decorator { public: using Decorator::Decorator; void operation() const override { std::cout << "[安全] 正在校验权限...\n"; // 模拟权限通过 Decorator::operation(); } };
使用方式与动态组合
可以在运行时根据需要叠加多个装饰器,实现行为的动态添加:
立即学习“C++免费学习笔记(深入)”;
网趣购物系统静态版支持网站一键静态生成,采用动态进度条模式生成静态,生成过程更加清晰明确,商品管理上增加淘宝数据包导入功能,与淘宝数据同步更新!采用领先的AJAX+XML相融技术,速度更快更高效!系统进行了大量的实用性更新,如优化核心算法、增加商品图片批量上传、谷歌地图浏览插入等,静态版独特的生成算法技术使静态生成过程可随意掌控,从而可以大大减轻服务器的负担,结合多种强大的SEO优化方式于一体,使
int main() {
auto comp = std::make_shared();
// 只有基础功能
comp->operation();
// 添加日志
auto logged = std::make_shared(comp);
logged->operation();
// 再添加安全检查
auto secured = std::make_shared(logged);
secured->operation();
return 0;
}
输出结果:
基础功能执行 [日志] 开始执行操作 基础功能执行 [日志] 操作完成 [安全] 正在校验权限... [日志] 开始执行操作 基础功能执行 [日志] 操作完成
适用场景与优势
这种模式适用于以下情况:
- 需要在运行时动态添加职责,而不是编译时静态确定
- 避免生成大量功能组合的子类(如 BufferedStream、EncryptedStream 等)
- 希望职责分离,每个装饰器只关注单一扩展功能
优势:灵活性高,符合开闭原则,易于复用和组合。相比多重继承更安全清晰。
基本上就这些,掌握好接口一致性和组合顺序,就能有效利用装饰器模式扩展对象行为。









