装饰器模式的C++实现示例

核心思想

装饰器设计模式是一种结构型设计模式,它允许动态地为对象添加额外的行为或职责,而无需修改其原始类。装饰器模式通过创建一个装饰器类来包装原始对象,并在保持原始对象接口一致性的前提下,扩展其功能。

装饰器模式的核心在于:

​动态扩展功能:在不改变原始对象的情况下,通过装饰器为其添加新的行为。

​组合优于继承:装饰器模式通过组合的方式扩展功能,避免了继承带来的类层次结构复杂化。

使用场景

​动态添加功能:当需要为对象动态地添加功能,并且这些功能可以组合使用时。

​避免子类膨胀:当使用继承会导致子类数量爆炸时,装饰器模式提供了一种更灵活的替代方案。

​扩展第三方库:当无法修改第三方库的代码,但需要为其添加额外功能时。

优点

​灵活性:可以动态地为对象添加或移除功能。

​遵循开闭原则:无需修改原始类,即可扩展其功能。

​避免继承的缺点:通过组合实现功能扩展,避免了继承带来的类层次结构复杂化。

缺点

​复杂性:装饰器模式会引入大量小类,增加了代码的复杂性。

​调试困难:由于装饰器是层层包装的,调试时可能难以追踪到具体的行为。

示例代码

cpp 复制代码
#include <iostream>
#include <memory>
#include <string>

// 抽象组件:定义文本接口
class Text {
public:
    virtual ~Text() = default;
    virtual std::string render() const = 0;
};

// 具体组件:实现基本的文本
class PlainText : public Text {
private:
    std::string content;

public:
    explicit PlainText(const std::string& content) : content(content) {}

    std::string render() const override {
        return content;
    }
};

// 抽象装饰器:继承自 Text,并包含一个 Text 对象的指针
class TextDecorator : public Text {
protected:
    std::shared_ptr<Text> text;

public:
    explicit TextDecorator(std::shared_ptr<Text> text) : text(std::move(text)) {}

    std::string render() const override {
        return text->render();
    }
};

// 具体装饰器:为文本添加加粗格式
class BoldText : public TextDecorator {
public:
    explicit BoldText(std::shared_ptr<Text> text) : TextDecorator(std::move(text)) {}

    std::string render() const override {
        return "<b>" + text->render() + "</b>";
    }
};

// 具体装饰器:为文本添加斜体格式
class ItalicText : public TextDecorator {
public:
    explicit ItalicText(std::shared_ptr<Text> text) : TextDecorator(std::move(text)) {}

    std::string render() const override {
        return "<i>" + text->render() + "</i>";
    }
};

// 具体装饰器:为文本添加下划线格式
class UnderlineText : public TextDecorator {
public:
    explicit UnderlineText(std::shared_ptr<Text> text) : TextDecorator(std::move(text)) {}

    std::string render() const override {
        return "<u>" + text->render() + "</u>";
    }
};

int main() {
    // 创建原始文本
    std::shared_ptr<Text> text = std::make_shared<PlainText>("Hello, World!");
	std::cout << text->render() << std::endl;
    // 动态添加装饰器
    text = std::make_shared<BoldText>(text);
    std::cout << text->render() << std::endl;

    text = std::make_shared<ItalicText>(text);
    std::cout << text->render() << std::endl;

    text = std::make_shared<UnderlineText>(text);
    std::cout << text->render() << std::endl;

    return 0;
}

输出结果

bash 复制代码
Hello, World!
<b>Hello, World!</b>
<i><b>Hello, World!</b></i>
<u><i><b>Hello, World!</b></i></u>

代码解析

​Text 类 :

抽象组件,定义了文本的接口 render()。

​PlainText 类 :

具体组件,实现了基本的文本渲染。

​TextDecorator 类 :

抽象装饰器,继承自 Text,并包含一个 Text 对象的指针。

提供了默认的 render() 实现,直接调用被装饰对象的 render() 方法。

​BoldText、ItalicText、UnderlineText 类 :

具体装饰器,继承自 TextDecorator,重写了 render() 方法,为文本添加额外的格式。

​main 函数 :

创建了一个原始文本对象 PlainText。

通过装饰器动态地为文本添加加粗、斜体和下划线格式。

最终渲染文本并输出结果。

装饰器模式通过动态地为对象添加额外的行为,提供了一种灵活的功能扩展方式。它避免了继承带来的类层次结构复杂化,同时遵循了开闭原则。在 C++ 中,可以通过组合和继承机制轻松实现装饰器模式。

相关推荐
启观川6 小时前
数据结构与算法 -第 3 章 常用算法-动态规划
数据结构·笔记·python·算法
码爸6 小时前
排序算法介绍
python·算法·排序算法
sm_926787056 小时前
RFID 标签打印的技术实现要点与二次开发实践
java·大数据·前端·c++·编辑器
by209996 小时前
C++ 多态:同一个基类接口,调用不同的函数
开发语言·c++·经验分享·多态
colinu6 小时前
C++ 异步任务与线程生命周期:`std::async`、`future`、`thread`、`jthread` 与协作式退出
java·jvm·c++
动词ing7 小时前
【题目练习】算法 组合总和||
算法
wuminyu7 小时前
ForkJoinPool窃取线程在扫描其他WorkQueue时的随机采样算法与Phase线程挂起唤醒机制解析
java·linux·c语言·jvm·c++
longlongzihan7 小时前
链表找环:Floyd 判圈算法(LeetCode 141 & 142 )
c++·算法·leetcode·链表
专业程序开发源7 小时前
flask家电故障预测系统92491-计算机课程设计/毕业设计
vscode·python·sql·算法·flask·课程设计
liulilittle7 小时前
Linux 下 select 测试函数
linux·服务器·网络·数据库·c++·select·c