当前位置: 首页 > article >正文

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

核心思想

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

装饰器模式的核心在于:
​动态扩展功能:在不改变原始对象的情况下,通过装饰器为其添加新的行为。
​组合优于继承:装饰器模式通过组合的方式扩展功能,避免了继承带来的类层次结构复杂化。

使用场景

​动态添加功能:当需要为对象动态地添加功能,并且这些功能可以组合使用时。
​避免子类膨胀:当使用继承会导致子类数量爆炸时,装饰器模式提供了一种更灵活的替代方案。
​扩展第三方库:当无法修改第三方库的代码,但需要为其添加额外功能时。

优点

​灵活性:可以动态地为对象添加或移除功能。
​遵循开闭原则:无需修改原始类,即可扩展其功能。
​避免继承的缺点:通过组合实现功能扩展,避免了继承带来的类层次结构复杂化。

缺点

​复杂性:装饰器模式会引入大量小类,增加了代码的复杂性。
​调试困难:由于装饰器是层层包装的,调试时可能难以追踪到具体的行为。

示例代码

#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;
}

输出结果

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++ 中,可以通过组合和继承机制轻松实现装饰器模式。


http://www.kler.cn/a/582154.html

相关文章:

  • 数据分析绘制随时间顺序变化图加入线性趋势线——numpy库的polyfit计算一次多项式拟合
  • 揭开AI-OPS 的神秘面纱 第五讲 AI 模型服务层(开源方向)
  • electron+vue+webview内嵌网页并注入js
  • 【实战ES】实战 Elasticsearch:快速上手与深度实践-6.1.1RBAC角色权限设计
  • 【Linux跬步积累】—— 网络基础
  • Windows系统编程项目(四)窗口管理器
  • 关于Go中使用goroutine协程实现的算法
  • java的字符串,数组,集合的长度/大小
  • 格雷希尔: G80P系列在制动卡钳行业自动化应用
  • 数据结构--【顺序表与链表】笔记
  • 第42天:WEB攻防-PHP应用MYSQL架构SQL注入跨库查询文件读写权限操作
  • DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加列宽调整功能,示例Table14_02带边框和斑马纹的固定表头表格
  • 【从零开始学习计算机科学】操作系统(四)进程的死锁
  • DeepSeek R1在医学领域的应用与技术分析(Discuss V1版)
  • Html5学习教程,从入门到精通, HTML5 新的 Input 类型:语法知识点与案例代码(16)
  • Git创建仓库和基本命令
  • 图纸的安全怎么管理?
  • Android 粘包与丢包处理工具类:支持多种粘包策略的 Helper 实现
  • 沉浸式CSS学习路径
  • 【实战ES】实战 Elasticsearch:快速上手与深度实践-7.3.2使用GraphQL封装查询接口