1. 装饰器模式的核心价值
在C++开发中,我们经常遇到需要动态扩展对象功能的场景。传统继承方式会导致类爆炸问题,而装饰器模式通过组合方式实现了运行时功能扩展。这种设计模式的核心在于保持接口一致性的前提下,通过嵌套包装实现功能的叠加。
装饰器模式特别适合以下场景:
- 需要在不修改原有代码的情况下扩展功能
- 需要动态添加或撤销功能
- 使用继承会导致类数量急剧膨胀的情况
我在实际项目中多次使用装饰器模式解决日志系统增强、网络请求拦截等需求。相比直接修改原有类,装饰器模式提供了更灵活的扩展方式。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 装饰器模式的结构解析
2.1 基础组件接口
装饰器模式的核心是保持接口一致性。我们先定义一个抽象基类作为所有组件和装饰器的共同接口:
cpp复制class Component {
public:
virtual ~Component() {}
virtual void operation() = 0;
};
这个纯虚接口确保了所有具体组件和装饰器都遵循相同的调用规范。在实际项目中,这个接口通常会包含多个需要装饰的方法。
2.2 具体组件实现
具体组件是实现基础功能的类,它不需要知道装饰器的存在:
cpp复制class ConcreteComponent : public Component {
public:
void operation() override {
std::cout << "执行基础操作" << std::endl;
}
};
这个实现类提供了最基本的功能,后续所有装饰器都会在此基础上进行增强。我在实际开发中发现,保持具体组件的简洁性非常重要,它应该只关注最核心的业务逻辑。
2.3 装饰器基类
装饰器基类同样继承自Component接口,它持有一个Component指针,这是实现装饰功能的关键:
cpp复制class Decorator : public Component {
protected:
Component* component_;
public:
Decorator(Component* component) : component_(component) {}
void operation() override {
if(component_) {
component_->operation();
}
}
};
这个基类实现了装饰器的基本结构,通过构造函数接收被装饰对象,并在operation()方法中转发调用。注意这里使用了保护继承,确保具体装饰器可以访问component_成员。
3. 具体装饰器实现
3.1 功能增强装饰器
具体装饰器通过在调用前后添加额外行为来实现功能增强:
cpp复制class ConcreteDecoratorA : public Decorator {
public:
ConcreteDecoratorA(Component* component) : Decorator(component) {}
void operation() override {
std::cout << "装饰
