装饰器模式(Decorator Pattern)是一种结构型设计模式,用于动态地给对象添加功能。装饰器模式提供了比继承更有弹性的替代方案,通过使用组合的方式来扩展对象的行为。
模式特点
- 透明性:装饰器模式可以在不修改对象结构的情况下为对象添加新的职责,且对使用该对象的代码是透明的。
- 灵活性:可以根据需要对对象进行装饰,动态地增加或删除对象的职责。
- 复用性:通过不同的装饰器类,可以实现职责的复用,不必每次都创建新的子类。
适用场景
- 动态地给一个对象添加额外的职责。例如,想要在不改变类的情况下增加功能。
- 需要扩展一个类的功能,或给一个类添加附加职责。例如,给一个图形对象添加边框或阴影。
- 通过一些基本功能的装饰组合,形成更复杂的功能。例如,在一个文本框上添加滚动条、边框等。
案例展示
以下是一个简单的C++装饰器模式的示例,模拟一个基本的文本打印功能,并添加不同的装饰器,如加粗和加下划线。
#include <iostream>
#include <memory>
// 抽象基类
class Text {
public:
virtual void print() const = 0;
virtual ~Text() = default;
};
// 具体组件
class SimpleText : public Text {
public:
void print() const override {
std::cout << "Simple Text";
}
};
// 装饰器基类
class TextDecorator : public Text {
protected:
std::unique_ptr<Text> text;
public:
TextDecorator(std::unique_ptr<Text> t) : text(std::move(t)) {}
};
// 具体装饰器类:加粗
class BoldDecorator : public TextDecorator {
public:
BoldDecorator(std::unique_ptr<Text> t) : TextDecorator(std::move(t)) {}
void print() const override {
std::cout << "<b>";
text->print();
std::cout << "</b>";
}
};
// 具体装饰器类:加下划线
class UnderlineDecorator : public TextDecorator {
public:
UnderlineDecorator(std::unique_ptr<Text> t) : TextDecorator(std::move(t)) {}
void print() const override {
std::cout << "<u>";
text->print();
std::cout << "</u>";
}
};
int main() {
// 创建一个简单的文本对象
std::unique_ptr<Text> simpleText = std::make_unique<SimpleText>();
// 用加粗装饰器装饰
std::unique_ptr<Text> boldText = std::make_unique<BoldDecorator>(std::move(simpleText));
// 用加下划线装饰器再装饰
std::unique_ptr<Text> decoratedText = std::make_unique<UnderlineDecorator>(std::move(boldText));
// 打印装饰后的文本
decoratedText->print(); // 输出: <u><b>Simple Text</b></u>
return 0;
}
案例说明
- 抽象基类 Text是一个抽象基类,定义了一个纯虚函数 print。所有具体的文本组件和装饰器都将实现这个接口。
- 具体组件 SimpleText是一个具体的文本类,实现了 Text 接口。print 方法输出 "Simple Text"。
- 装饰器基类 TextDecorator是一个抽象装饰器类,继承自 Text,持有一个指向 Text 对象的指针,允许装饰器在其基础上增加新功能。
- 具体装饰器类 BoldDecorator继承自 TextDecorator,为 Text 对象增加加粗功能,它的 print 方法在原有 Text 对象的 print 输出前后添加
<b>
和</b>
标签。 - 具体装饰器类 UnderlineDecorator继承自 TextDecorator,为 Text 对象增加下划线功能,它的 print 方法在原有 Text 对象的 print 输出前后添加
<u>
和</u>
标签。
模式总结
装饰器模式通过将对象放入包含行为的特殊封装对象中,扩展了对象的功能。它具有很高的灵活性和透明性,可以在运行时动态地组合出不同的行为。装饰器模式非常适用于需要在不修改类定义的前提下动态扩展对象功能的场景,解决了类爆炸问题,提高了代码的可维护性和复用性。
END
今天是日更的第18/100天
封面照片:Zhihong
版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: