装饰器模式(Decorator)
装饰器模式是一种结构型设计模式,用于动态地给对象添加额外的功能。装饰器模式通过将功能附加到对象而不是继承来实现扩展,使得在运行时可以灵活地扩展对象的行为,而无需修改对象的代码。
1. 装饰器模式的结构
装饰器模式包含以下几个主要组件:
- Component(组件接口): 定义了一个对象接口,可以给这些对象添加额外的功能。
- ConcreteComponent(具体组件): 实现了
Component
接口的实际对象。 - Decorator(装饰器抽象类): 维护一个
Component
对象的引用,并实现了Component
接口。它的目的是为具体装饰器提供一个基础。 - ConcreteDecorator(具体装饰器): 扩展了
Decorator
类,增加了具体的功能。
2. Mermaid 关系图
以下是装饰器模式的类图,用 Mermaid 表示:
classDiagram class Component { + operation() : void } class ConcreteComponent { + operation() : void } class Decorator { + operation() : void } class ConcreteDecoratorA { + operation() : void } class ConcreteDecoratorB { + operation() : void } Component <|-- ConcreteComponent Component <|-- Decorator Decorator <|-- ConcreteDecoratorA Decorator <|-- ConcreteDecoratorB Decorator --> Component : "委托"
3. 装饰器模式的实现
Component 组件接口:
class Component {
public:
virtual ~Component() = default;
virtual void operation() const = 0;
};
ConcreteComponent 具体组件类:
class ConcreteComponent : public Component {
public:
void operation() const override {
std::cout << "ConcreteComponent operation\n";
}
};
Decorator 装饰器抽象类:
class Decorator : public Component {
protected:
Component* component;
public:
Decorator(Component* comp) : component(comp) {}
virtual ~Decorator() = default;
void operation() const override {
component->operation();
}
};
ConcreteDecoratorA 具体装饰器A:
class ConcreteDecoratorA : public Decorator {
public:
ConcreteDecoratorA(Component* comp) : Decorator(comp) {}
void operation() const override {
Decorator::operation();
std::cout << "ConcreteDecoratorA additional operation\n";
}
};
ConcreteDecoratorB 具体装饰器B:
class ConcreteDecoratorB : public Decorator {
public:
ConcreteDecoratorB(Component* comp) : Decorator(comp) {}
void operation() const override {
Decorator::operation();
std::cout << "ConcreteDecoratorB additional operation\n";
}
};
4. 使用装饰器模式
在客户端代码中,通过组合多个装饰器来动态地给对象添加功能。示例:
int main() {
Component* simple = new ConcreteComponent();
Component* decoratedA = new ConcreteDecoratorA(simple);
Component* decoratedB = new ConcreteDecoratorB(decoratedA);
decoratedB->operation();
delete decoratedB;
delete decoratedA;
delete simple;
return 0;
}
5. 总结
装饰器模式通过将功能附加到对象而不是继承,使得在运行时可以灵活地扩展对象的行为。Mermaid 类图展示了组件、具体组件、装饰器抽象类、具体装饰器以及它们之间的关系,帮助理解模式的结构和实现。