设计模式--装饰器模式

引言

装饰器模式(Decorator Pattern)是一种结构型设计模式,它动态地为对象添加额外的职责,而无需修改原有对象的结构。通过创建装饰类来包裹原有的对象,并在装饰类中添加新功能,从而实现功能的灵活扩展和组合,保持了良好的代码结构和高内聚低耦合的原则。

应用场景
  • 需要在运行时动态地为对象添加功能,这些功能可以自由组合。
  • 有大量具有相似功能的对象,希望通过装饰的方式避免为每种组合创建新的子类。
  • 当不能采用继承来扩展对象功能,因为这会导致类爆炸问题时。
使用技巧与注意事项
  • 保持接口一致性:装饰器类必须与被装饰的原始类遵循相同的接口,以保证透明性。
  • 多层次装饰:装饰器模式支持多重装饰,但要注意装饰层数过多可能会导致调试和理解上的困难。
  • 谨慎使用:尽管装饰器模式提供了灵活性,但如果功能变化较少或不频繁,直接使用继承可能更简单直接。
  • 性能考量:每增加一层装饰,都会带来一定的性能开销,特别是当装饰层数较多时。
C++代码示例

假设我们正在设计一个简单的文本编辑器,需要为文本字符串添加各种格式化功能(如加粗、斜体、下划线)。这是一个非常适合应用装饰器模式的场景。

#include <iostream>
#include <memory>// 抽象组件:文本接口
class TextComponent {
public:virtual ~TextComponent() {}virtual std::string format() const = 0;
};// 具体组件:原始文本
class PlainText : public TextComponent {
public:PlainText(const std::string& text) : text_(text) {}std::string format() const override { return text_; }private:std::string text_;
};// 抽象装饰器:为文本组件添加功能
class TextDecorator : public TextComponent {
public:explicit TextDecorator(TextComponent* textComponent) : textComponent_(textComponent) {}std::string format() const override { return textComponent_->format(); }protected:TextComponent* textComponent_;
};// 具体装饰器:加粗
class BoldDecorator : public TextDecorator {
public:explicit BoldDecorator(TextComponent* textComponent) : TextDecorator(textComponent) {}std::string format() const override {return "<b>" + textComponent_->format() + "</b>";}
};// 具体装饰器:斜体
class ItalicDecorator : public TextDecorator {
public:explicit ItalicDecorator(TextComponent* textComponent) : TextDecorator(textComponent) {}std::string format() const override {return "<i>" + textComponent_->format() + "</i>";}
};// 具体装饰器:下划线
class UnderlineDecorator : public TextDecorator {
public:explicit UnderlineDecorator(TextComponent* textComponent) : TextDecorator(textComponent) {}std::string format() const override {return "<u>" + textComponent_->format() + "</u>";}
};int main() {std::unique_ptr<TextComponent> plainText = std::make_unique<PlainText>("Hello, World!");std::unique_ptr<TextComponent> boldText = std::make_unique<BoldDecorator>(plainText.get());std::unique_ptr<TextComponent> italicBoldText = std::make_unique<ItalicDecorator>(boldText.get());std::cout << italicBoldText->format() << std::endl; // 输出: <i><b>Hello, World!</b></i>return 0;
}

在这个例子中,TextComponent是抽象组件接口,PlainText是具体组件,代表原始文本。TextDecorator是抽象装饰器类,提供了装饰的基础结构。BoldDecoratorItalicDecoratorUnderlineDecorator是具体的装饰器类,分别负责添加加粗、斜体和下划线功能。通过组合这些装饰器,我们可以灵活地为文本添加多种格式,而无需修改原始文本类,展示了装饰器模式的强大灵活性和扩展性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/840083.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[力扣题解] 684. 冗余连接

题目&#xff1a;684. 冗余连接 思路 并查集&#xff1b; 从前往后遍历&#xff0c;如果不属于同一个集合&#xff08;不是同一个爸爸&#xff09;&#xff0c;就加入&#xff0c;否则就返回这条边&#xff1b; 因为不属于同一个集合&#xff0c;加入可以形成树&#xff0c;要…

Vue 3 的 setup语法糖工作原理

前言 我们每天写vue3项目的时候都会使用setup语法糖&#xff0c;但是你有没有思考过下面几个问题。setup语法糖经过编译后是什么样子的&#xff1f;为什么在setup顶层定义的变量可以在template中可以直接使用&#xff1f;为什么import一个组件后就可以直接使用&#xff0c;无需…

KDE-Ambari-Metrics-Collector问题排查解决手册

文档说明 本文档是为了解决KDE平台的Ambari-Metrics-Collector服务在运行时遇到的问题而提供的问题排查和解决方法的参考文档 说明: 当前的Ambari-Metrics-Collector服务包括了ams-collector和ams-hbase两个程序,在Ambari-Metrics-Collector安装的节点执行ps -elf|grep am…

远动通讯屏具体干啥作用

远动通讯屏具体干啥作用 远动通讯屏主要用于电力系统中的各类发电厂、变电站、光伏电站、开闭所、配电房等&#xff0c;具有实时传输数据和远程控制功能。它的主要作用包括&#xff1a; 数据采集&#xff1a;远动通讯屏能够采集各种模拟量、开关量和数字量等信息&#xff0c…

Java设计模式-备忘录模式(23)

备忘录模式(Memento Pattern)是一种行为设计模式,它提供了一种在不破坏对象封装性的前提下,捕获并存储对象的内部状态,并且可以在将来需要的时候恢复对象状态的方式。这一模式非常适合用于需要撤销操作或者实现状态回滚的场景。以下是Java中备忘录模式的详细解释: 核心角…

云计算的主要服务模式有哪几种?分别是什么特点?

云计算主要有以下几种服务模式&#xff1a; Infrastructure as a Service (IaaS&#xff0c;基础设施即服务)&#xff1a;提供虚拟化的计算资源&#xff0c;如服务器、存储和网络等基础设施。用户可以根据需要自由配置和管理这些资源&#xff0c;具有灵活性和可扩展性。 Platf…

pod介绍之 容器分类与重启策略

目录 一 pod 基础概念介绍 1&#xff0c;pod 是什么 2&#xff0c;Pod使用方式 3&#xff0c;如何解决一个pod 多容器通信 4&#xff0c;pod 组成 5&#xff0c; k8s 中的 pod 二 pause容器 1&#xff0c;pause容器 是什么 2&#xff0c;pause容器作用 3&#xff…

GitLab的原理及应用详解(二)

本系列文章简介: 随着软件开发的不断进步和发展,版本控制系统成为了现代软件开发过程中不可或缺的一部分。而GitLab作为其中一种流行的版本控制工具,在软件开发领域享有广泛的应用。GitLab不仅提供了强大的版本控制功能,还集成了项目管理、持续集成和部署、代码审查等多个功…

LeetCode-105-岛屿的最大面积

题目描述&#xff1a;给定一个由 0 和 1 组成的非空二维数组 grid &#xff0c;用来表示海洋岛屿地图。 一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合&#xff0c;这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0&#xff08…

docker 笔记汇总

ubuntu 20.04 安装docker https://zhuanlan.zhihu.com/p/143156163 sudo apt update sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -s…

MybatisPlus优雅实现加密?

前言 最近在搞个安全需求&#xff0c;需要对敏感字段做加密存储。于是&#xff0c;&#xff0c;于是我就躺了个坑。 方案梳理 方案一&#xff1a;基于Mybatis的拦截器Interceptor 我的第一个反应其实是基于Mybatis的拦截器Interceptor机制实现&#xff0c;在设置参数的时候…

Vue开发实例(十三)用户登录功能

使用Vue实现登录具有以下几个好处&#xff1a; 响应式界面&#xff1a;Vue框架的响应式特性可以帮助开发者轻松地实现用户登录界面的交互效果&#xff0c;包括表单验证、实时错误提示等&#xff0c;从而提升用户体验。组件化开发&#xff1a;Vue框架支持组件化开发&#xff0c;…

【AI学习】卷积神经网络的由来

乱读书&#xff0c;看见这么这段话&#xff1a; “生物的眼睛以精巧的方式与大脑相连。视网膜上的感光细胞&#xff08;人眼的视杆或视锥&#xff09;并不直接连接到单个神经元上&#xff0c;而是会有一整片区域的神经元与每一个感光细胞相连接。相邻的神经元会连接到视网膜上相…

最新版npm详解

如&#xff1a;npm中搜索 jQuery image.png image.png 接地气的描述&#xff1a;npm 类似于如下各大手机应用市场 image.png image.png 查看本地 node 和 npm 是否安装成功 image.png image.png 或 npm install -g npm image.png image.png image.png image.png image.…

【数据库】MySQL

文章目录 概述DDL数据库操作查询使用创建删除 表操作创建约束MySqL数据类型数值类型字符串类型日期类型 查询修改删除 DMLinsertupdatedelete DQL基本查询条件查询分组查询分组查询排序查询分页查询 多表设计一对多一对一多对多设计步骤 多表查询概述内连接外连接 子查询标量子…

这所211专硕22408复试线310分,学硕收调剂!辽宁大学计算机考研考情分析!

辽宁大学信息学院下设计算机科学与技术、电子信息科学与技术、通信工程、信息管理与信息系统、软件工程5个本科专业&#xff0c;有计算机软件与理论、计算机应用技术2个硕士学位授权点&#xff0c;软件工程和计算机技术两个专业硕士学位点&#xff0c;1个计算机应用研究所、1个…

wordpress woocommer 添加代码实现,点击按钮,将产品添加到购物车并且跳转到结账页面

wordpress woocommer 添加代码实现&#xff0c;点击按钮&#xff0c;将产品添加到购物车并且跳转到结账页面 案列代码1&#xff0c;解决的是普通产品的 //短代码生成按钮&#xff0c;传入短代码&#xff0c;点击直接到达结账页面 function add_product_to_cart_button($atts)…

案例题(第一版)

案例题目 软件架构设计考点&#xff08;历年必考&#xff09; 软件架构设计通常在每年的第一题&#xff0c;该题必考 必备概念 必备概念即考试必须要默写出来的概念 概念描述软件架构风格是指描述特定软件系统组织方式和惯用模式。组织方式描述了系统的组成构件和这些构件的组…

在Spring Boot项目中通过自定义注解实现多数据源以及主备数据库切换

在现代的企业应用开发中&#xff0c;使用多数据源是一个常见的需求。尤其在关键应用中&#xff0c;设置主备数据库可以提高系统的可靠性和可用性。在这篇博客中&#xff0c;我将展示如何在Spring Boot项目中通过自定义注解实现多数据源以及主备数据库切换。 在此说明&#xff…

【HTML】制作一个跟随鼠标的流畅线条引导页界面(可直接复制源码)

目录 前言 HTML部分 CSS部分 JS部分 效果图 总结 前言 无需多言&#xff0c;本文将详细介绍一段HTML代码&#xff0c;图中线条可跟随鼠标移动&#xff0c;具体内容如下&#xff1a; 开始 首先新建一个HTML的文本&#xff0c;文本名改为[index.html]&#xff0c;创建好后右…