六.装饰器模式
- 一.装饰器模式
- 1.原理
- 2.适用场景
- 二.C++程序示例
- 1.语法组成
- 2.C++示例
一.装饰器模式
1.原理
装饰器模式是一种结构性设计模式,其目的是通过包装对象来扩展其行为而不改变其接口。该模式可以动态地将责任附加到对象上,从而提供一种灵活的替代方法,以继承的方式静态地扩展对象的行为。
2.适用场景
装饰器模式适用于需要动态地扩展对象的行为或在不修改原始类的情况下添加新的功能的场景,如:
- 动态地添加、删除或修改对象的行为,而无需修改原始类的代码。
- 在运行时动态地为对象添加日志记录、性能测量、安全检查等行为。
- 为对象动态地添加新的方法或属性,而不必使用继承。
- 为图形用户界面添加特定的功能,例如滚动条、边框、背景颜色等。
- 为已有的类库添加新的行为。
- 需要灵活地组合多个功能时,以实现复杂的行为。
- 需要遵循开放/封闭原则,以便在不修改现有代码的情况下添加新的功能。
二.C++程序示例
1.语法组成
装饰器模式的语法组成包括:
- 抽象组件(Component):定义了原始对象和装饰器对象共同实现的接口。
- 具体组件(ConcreteComponent):实现了抽象组件接口,并提供了默认的行为。
- 抽象装饰器(Decorator):定义了具体装饰器和抽象组件共同实现的接口,并持有一个抽象组件的引用。
- 具体装饰器(ConcreteDecorator):实现了抽象装饰器接口,并持有一个抽象组件的引用,从而可以动态地为抽象组件添加新的行为。
在使用装饰器模式时,首先需要定义一个抽象组件接口,以及一个或多个具体组件类来实现该接口。然后定义一个抽象装饰器接口,并为每个需要添加新行为的具体组件类创建一个具体装饰器类。具体装饰器类可以通过在抽象组件上包装其他对象来实现新的行为。最后,可以通过将具体组件对象传递给具体装饰器对象,动态地添加新行为。
2.C++示例
#include <iostream>
using namespace std;
// 抽象组件
class Component {
public:
virtual void operation() = 0;
};
// 具体组件
class ConcreteComponent : public Component {
public:
void operation() override {
cout << "ConcreteComponent operation." << endl;
}
};
// 抽象装饰器
class Decorator : public Component {
protected:
Component* component;
public:
Decorator(Component* component) : component(component) {}
void operation() override {
if (component) {
component->operation();
}
}
};
// 具体装饰器A
class ConcreteDecoratorA : public Decorator {
public:
ConcreteDecoratorA(Component* component) : Decorator(component) {}
void operation() override {
Decorator::operation();
addBehaviorA();
}
void addBehaviorA() {
cout << "ConcreteDecoratorA addBehaviorA." << endl;
}
};
// 具体装饰器B
class ConcreteDecoratorB : public Decorator {
public:
ConcreteDecoratorB(Component* component) : Decorator(component) {}
void operation() override {
Decorator::operation();
addBehaviorB();
}
void addBehaviorB() {
cout << "ConcreteDecoratorB addBehaviorB." << endl;
}
};
int main() {
Component* component = new ConcreteComponent();
component = new ConcreteDecoratorA(component);
component = new ConcreteDecoratorB(component);
component->operation();
delete component;
return 0;
}
这个示例包含一个抽象组件类Component、一个具体组件类ConcreteComponent和两个具体装饰器类ConcreteDecoratorA和ConcreteDecoratorB。
在main函数中,我们首先创建一个ConcreteComponent对象,然后用ConcreteDecoratorA和ConcreteDecoratorB装饰它,最后调用operation方法以观察输出结果。输出结果如下:
可以看到,具体组件的默认行为在两个具体装饰器的新行为之前被执行,而两个具体装饰器的新行为则按顺序被执行。