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

装饰器模式在C++中是一种结构型设计模式,用于在不修改原有类的前提下,动态地给对象添加新的行为。相比继承,它更灵活,避免了类爆炸问题,特别适合需要在运行时组合功能的场景。
装饰器模式核心思想
通过组合而非继承来扩展功能。装饰器类持有被装饰对象的实例,对外提供与原对象相同的接口,在调用前后可以添加额外逻辑。
关键点:
- 抽象组件(Component)定义接口
- 具体组件(ConcreteComponent)实现基础功能
- 装饰器基类(Decorator)继承组件接口,包含组件指针
- 具体装饰器(ConcreteDecorator)添加新行为
基本实现结构
#include <iostream>
#include <memory>
// 抽象组件
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> component_;
public:
explicit Decorator(std::shared_ptr<Component> 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++免费学习笔记(深入)”;
int main() {
auto comp = std::make_shared<ConcreteComponent>();
// 只有基础功能
comp->operation();
// 添加日志
auto logged = std::make_shared<LoggingDecorator>(comp);
logged->operation();
// 再添加安全检查
auto secured = std::make_shared<SecurityDecorator>(logged);
secured->operation();
return 0;
}
输出结果:
基础功能执行 [日志] 开始执行操作 基础功能执行 [日志] 操作完成 [安全] 正在校验权限... [日志] 开始执行操作 基础功能执行 [日志] 操作完成
适用场景与优势
这种模式适用于以下情况:
- 需要在运行时动态添加职责,而不是编译时静态确定
- 避免生成大量功能组合的子类(如 BufferedStream、EncryptedStream 等)
- 希望职责分离,每个装饰器只关注单一扩展功能
优势:灵活性高,符合开闭原则,易于复用和组合。相比多重继承更安全清晰。
基本上就这些,掌握好接口一致性和组合顺序,就能有效利用装饰器模式扩展对象行为。










