文章目录
- 装饰模式简介
- 装饰模式结构
- 装饰模式代码
装饰模式简介
装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许向现有对象动态添加新功能,而不需要修改其现有代码,并且可以通过组合多个装饰器对象实现多种功能组合,灵活性高。
装饰模式结构
Component(组件,对应下图中的主体-接口类):定义一个对象接口,可以动态地为对象添加新的功能。
ConcreteComponent(具体组件,对应下图中的主体-具体实现类):实现Component接口的具体对象,是被装饰的原始对象。
Decorator(装饰器,对象下图中装饰品–接口类):继承自Component,并持有一个Component对象,用于动态地为Component添加新的功能。
ConcreteDecorator(具体装饰器,对象下图中装饰品–具体实现类):实现Decorator接口的具体装饰器对象,负责向Component对象添加新的功能。
装饰模式代码
#include <iostream>
#include <string>
如何使用装饰器模式实现对文本的加密和压缩功能
// Component(组件)接口
class Text
{
public:
virtual std::string getContent() = 0;
};
// ConcreteComponent(具体组件)类
// 具体组件类在调用时用基类指针/引用
class PlainText : public Text
{
private:
std::string content;
public:
// 完成对文本内容的初始化
PlainText(const std::string& text)
: content(text)
{
}
// 组件的基本功能
std::string getContent() override
{
return content;
}
};
// Decorator(装饰器)类
class TextDecorator : public Text
{
protected:
Text* text;
public:
// 具体组件类在被装饰时用基类指针/引用
TextDecorator(Text* t)
: text(t)
{
}
std::string getContent() override
{
return text->getContent();
}
};
// ConcreteDecorator(具体装饰器)类 - 加密装饰器
class EncryptionDecorator : public TextDecorator
{
public:
// 调用被装饰对象的类的构造函数, 初始化被装饰对象已有的部分
// 如果有多个具体装饰器类,可以多次装饰,且装饰效果可以叠加,即功能可拓展
EncryptionDecorator(Text* t)
: TextDecorator(t)
{
}
std::string getContent() override
{
std::string content = text->getContent();
// 简单加密(示例)
for (char& c : content)
{
c = c + 1;
}
return content;
}
};
// ConcreteDecorator(具体装饰器)类 - 压缩装饰器
class CompressionDecorator : public TextDecorator
{
public:
CompressionDecorator(Text* t)
: TextDecorator(t)
{
}
std::string getContent() override
{
std::string content = text->getContent();
// 简单压缩(示例)
return content.substr(0, content.size() / 2);
}
};
int main()
{
Text* text = new PlainText("Hello, World!");
// 添加加密功能
Text* encryptedText = new EncryptionDecorator(text);
std::cout << "Encrypted Text: " << encryptedText->getContent() << std::endl;
// 添加压缩功能
Text* compressedText = new CompressionDecorator(text);
std::cout << "Compressed Text: " << compressedText->getContent() << std::endl;
delete text;
delete encryptedText;
delete compressedText;
return 0;
}