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

设计模式----装饰器模式

在软件开发过程中,有时想用一些现存的组件。这些组件可能只是完成了一些核心功能。但在不改变其结构的情况下,可以动态地扩展其功能。所有这些都可以釆用装饰器模式来实现。

装饰器模式

允许向一个现有的对象添加新的功能,同时又不改变他的结构(进行扩展)。

装饰器模式的结构与实现

通常情况下,扩展一个类的功能会使用继承方式来实现。但继承具有静态特征,耦合度高,并且随着扩展功能的增多,子类会很膨胀。如果使用组合关系来创建一个包装对象(即装饰对象)来包裹真实对象,并在保持真实对象的类结构不变的前提下,为其提供额外的功能,这就是装饰器模式的目标。

结构

抽象构件(Component):定义一个抽象接口以规范准备接收附加责任的对象
具体构件(Concrete Component):实现抽象构件,通过装饰器角色为其添加一些职责
抽象装饰(Decorator):继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能
具体装饰(Concrete Decorator):实现抽象装饰的相关方法,并给具体构件对象添加附加的责任

装饰器模式UML图

实现

#include <iostream>
#include <string>
using namespace std;//装饰器模式
class Phone
{
public:Phone(){}~Phone(){}virtual void showDecorate(){}
};class iPhone :public Phone
{
private:string _name;
public:iPhone(string name):_name(name){}~iPhone(){}void showDecorate(){cout << _name << "装饰器" << endl;}
};class NokiaPhone :public Phone
{
private:string _name;
public:NokiaPhone(string name):_name(name){}~NokiaPhone(){}void showDecorate(){cout << _name << "装饰器" << endl;}
};class DecoratorPhone :public Phone
{
private:Phone* m_phone;
public:DecoratorPhone(Phone *phone):m_phone(phone){}virtual void showDecorate(){m_phone->showDecorate();}
};class DecoratePhoneA :public DecoratorPhone
{
public:DecoratePhoneA(Phone *phone):DecoratorPhone(phone){}void showDecorate(){DecoratorPhone::showDecorate();AddDecorate();}
private:void AddDecorate(){cout << "增加挂件" << endl;}
};class DecoratePhoneB :public DecoratorPhone
{
public:DecoratePhoneB(Phone* phone):DecoratorPhone(phone){}void showDecorate(){DecoratorPhone::showDecorate();AddDecorate();}
private:void AddDecorate(){cout << "增加屏膜" << endl;}
};void main()
{Phone* phone = new NokiaPhone("6300");Phone* phoneA = new DecoratePhoneA(phone);Phone* phoneB = new DecoratePhoneB(phone);phoneA->showDecorate();phoneB->showDecorate();delete phone; phone = NULL;delete phoneA; phoneA = NULL;delete phoneB; phoneB = NULL;
}

装饰器模式的优缺点

优点:
可以不用修改原有的接口,就可以实现新功能的添加
装饰者可以很方便的转换原有接口中的实现,可以给装饰者指定不同的ConcreteComponent实现不同的功能。
缺点:
复杂性增加,装饰者模式会导致许多小类的产生。

装饰器模式应用场景

前面讲解了关于装饰器模式的结构与特点,下面介绍其适用的应用场景,装饰器模式通常在以下几种情况使用。

当需要给一个现有类添加附加职责,而又不能采用生成子类的方法进行扩充时。例如,该类被隐藏或者该类是终极类或者采用继承方式会产生大量的子类。
当需要通过对现有的一组基本功能进行排列组合而产生非常多的功能时,采用继承关系很难实现,而采用装饰器模式却很好实现。
当对象的功能要求可以动态地添加,也可以再动态地撤销时。

相关文章:

设计模式----装饰器模式

在软件开发过程中&#xff0c;有时想用一些现存的组件。这些组件可能只是完成了一些核心功能。但在不改变其结构的情况下&#xff0c;可以动态地扩展其功能。所有这些都可以釆用装饰器模式来实现。 装饰器模式 允许向一个现有的对象添加新的功能&#xff0c;同时又不改变他的…...

Golang pprof 分析程序的使用内存和执行时间

一、分析程序执行的内存情况 package mainimport ("os""runtime/pprof" )func main() {// ... 你的程序逻辑 ...// 将 HeapProfile 写入文件f, err : os.Create("heap.prof")if err ! nil {panic(err)}defer f.Close()pprof.WriteHeapProfile(f…...

C/C++平方和问题(蓝桥杯)

题目描述&#xff1a; 小明对数位中含有2、0、1、9 的数字很感兴趣&#xff0c;在1 到40 中这样的数包 括1、2、9、10 至32、39 和40&#xff0c;共28 个&#xff0c;他们的和是574&#xff0c;平方和是14362。 注意&#xff0c;平方和是指将每个数分别平方后求和。 请问&#…...

(libusb) usb口自动刷新

文章目录 libusb自动刷新程序Code目录结构Code项目文件usb包code包 效果描述重置reset热拔插使用 END libusb 在操作USB相关内容时&#xff0c;有一个比较著名的库就是libusb。 官方网址&#xff1a;libusb 下载&#xff1a; 下载源码官方编好的库github&#xff1a;Release…...

NLP(一)——概述

参考书: 《speech and language processing》《统计自然语言处理》 宗成庆 语言是思维的载体&#xff0c;自然语言处理相比其他信号较为特别 word2vec用到c语言 Question 预训练语言模型和其他模型的区别? 预训练模型是指在大规模数据上进行预训练的模型&#xff0c;通常…...

智慧公厕:打造智慧城市的环卫明珠

在城市建设中&#xff0c;公共卫生设施的完善和智能化一直是重要环节。而智慧公厕作为智慧城市建设的重要组成部分&#xff0c;发挥着不可替代的作用。本文以智慧公厕源头实力厂家广州中期科技有限公司&#xff0c;大量精品案例现场实景实图&#xff0c;解读智慧公厕如何助力打…...

[LeetBook]【学习日记】寻找链表相交节点

来源于「Krahets」的《图解算法数据结构》 https://leetcode.cn/leetbook/detail/illustration-of-algorithm/ 本题与主站 160 题相同&#xff1a;https://leetcode-cn.com/problems/intersection-of-two-linked-lists/ 训练计划 V 某教练同时带教两位学员&#xff0c;分别以…...

【Python】OpenCV-使用ResNet50进行图像分类

使用ResNet50进行图像分类 如何使用ResNet50模型对图像进行分类。 import os import cv2 import numpy as np from tensorflow.keras.applications.resnet50 import ResNet50, preprocess_input, decode_predictions from tensorflow.keras.preprocessing import image# 设置…...

TypeError: `dumps_kwargs` keyword arguments are no longer supported

TypeError: dumps_kwargs keyword arguments are no longer supported 1. 问题描述2. 解决方法 1. 问题描述 使用 FastChat 启动私有大语言模型&#xff0c;通过一些 UI 工具进行访问时&#xff0c;报以下错误。 略 2024-02-29 09:26:14 | ERROR | stderr | yield f"…...

设计模式学习笔记 - 设计原则 - 3.里氏替换原则,它和多态的区别是什么?

前言 今天来学习 SOLID 中的 L&#xff1a;里氏替换原则。它的英文翻译是 Liskov Substitution Principle&#xff0c;缩写为 LSP。 英文原话是&#xff1a; Functions that use points of references of base classes must be able to use objects of derived classes withou…...

java实现图片转pdf,并通过流的方式进行下载(前后端分离)

首先需要导入相关依赖&#xff0c;由于具体依赖本人也不是记得很清楚了&#xff0c;所以简短的说一下。 iText&#xff1a;PDF 操作库&#xff0c;用于创建和操作 PDF 文件。可通过 Maven 或 Gradle 引入 iText 依赖。 MultipartFile&#xff1a;Spring 框架中处理文件上传的类…...

如何系统的学习Python——Python的基本语法

学习Python的基本语法是入门的第一步&#xff0c;以下是一些常见的基本语法概念&#xff1a; 注释&#xff1a; 用#符号来添加单行注释&#xff0c;或使用三引号(或""")来添加多行注释。 # 这是一个单行注释 这是 多行 注释 变量和数据类型&#xff1a; 变量用…...

相机,棱镜和光场

一、成像方法 Imaging Synthesis Capture 1.Synthesis&#xff08;图形学上&#xff09;合成&#xff1a;比如之前学过的光线追踪或者光栅化 2.Capture&#xff08;捕捉&#xff09;&#xff1a;把真实世界存在的东西捕捉成为照片 二、相机 1.小孔成像 利用小孔成像的相…...

【图像版权】论文阅读:CRMW 图像隐写术+压缩算法

不可见水印 前言背景介绍ai大模型水印生成产物不可见水印CRMW 在保护深度神经网络模型知识产权方面与现有防御机制有何不同&#xff1f;使用图像隐写术和压缩算法为神经网络模型生成水印数据集有哪些优势&#xff1f;特征一致性训练如何发挥作用&#xff0c;将水印数据集嵌入到…...

代码随想录算法训练营第31天—贪心算法05 | ● 435. 无重叠区间 ● *763.划分字母区间 ● *56. 合并区间

435. 无重叠区间 https://programmercarl.com/0435.%E6%97%A0%E9%87%8D%E5%8F%A0%E5%8C%BA%E9%97%B4.html 考点 贪心算法重叠区间 我的思路 先按照区间左坐标进行排序&#xff0c;方便后续处理进行for循环&#xff0c;循环范围是0到倒数第二个元素如果当前区间和下一区间重叠…...

2024《》

vue-cli到哪做了那些事 vue-cli是vue.js的脚手架&#xff0c;用于自动生成vue.jswebpack的项目模板&#xff0c;快速搭建Vue.js项目。 vue cli内置了webpack的一些功能&#xff0c;这些是用webpack打包时需要我们自己配置的&#xff0c;例如&#xff1a; 1.ES6代码转换成ES5代…...

【Web】Java反序列化之从CC3看TemplatesImpl的利用

目录 关于TemplatesImpl 关于TemplatesImpl加载字节码 CC3链分析 纯CC3demo 根据CC3改CC6 关于TemplatesImpl TemplatesImpl 是 Java 中的一个类&#xff0c;通常与 Java 反序列化漏洞相关的攻击中被使用。该类位于 Java 标准库中的 javax.xml.transform 包下。 在 Java…...

【Elasticsearch索引】Recovery恢复索引

文章目录 索引恢复恢复列表获取恢复信息响应详细信息正在进行的恢复响应解析高级设置 本地分片恢复事务日志 索引恢复 索引恢复提供了对正在进行的索引分片恢复的洞察。恢复状态可以针对特定的索引报告&#xff0c;也可以在集群范围内报告。 恢复列表 recovery命令是索引分片…...

如何在 Linux 中快速清空文件而不删除它们?

在Linux系统中&#xff0c;清空文件而不删除它们是一种常见的需求&#xff0c;特别是在需要保留文件结构或权限的情况下。本文将详细介绍如何在Linux环境中快速清空文件内容的多种方法&#xff0c;以及每种方法的优缺点。清空文件通常涉及到文件内容的擦除&#xff0c;但并不涉…...

SpringBoot 配置文件${variable:default}用法

${variable:default}用法&#xff0c;variable​是变量名&#xff0c;default​是默认值。如果配置文件中未指定该变量的值&#xff0c;则会使用默认值来替代。 解释代码&#xff1a; ip: ${NACOS_IP:nacos.ip} 该yaml函数是一个配置项&#xff0c;用来指定Nacos服务器的IP地…...

终极解决方案:三步彻底卸载Windows系统中顽固的Microsoft Edge浏览器

终极解决方案&#xff1a;三步彻底卸载Windows系统中顽固的Microsoft Edge浏览器 【免费下载链接】EdgeRemover A PowerShell script that correctly uninstalls or reinstalls Microsoft Edge on Windows 10 & 11. 项目地址: https://gitcode.com/gh_mirrors/ed/EdgeRem…...

抖音下载神器:如何免费批量下载无水印视频、音乐和图片

抖音下载神器&#xff1a;如何免费批量下载无水印视频、音乐和图片 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback supp…...

GPT5.5怎么切中文界面设置教程一看就会

做多模型中文能力对比测试时用了AI模型聚合平台&#xff0c;一站接入多个模型方便对比不同模型的中文输出质量。GPT-5.5上线快一个月了。注册完打开一看全是英文界面&#xff0c;切了半天没找到在哪改。搜了一圈教程要么过时要么步骤不全。这次把2026年5月最新的中文设置全流程…...

终极免费LRC歌词制作工具:3分钟学会专业歌词同步技巧 [特殊字符]

终极免费LRC歌词制作工具&#xff1a;3分钟学会专业歌词同步技巧 &#x1f3b5; 【免费下载链接】lrc-maker 歌词滚动姬&#xff5c;可能是你所能见到的最好用的歌词制作工具 项目地址: https://gitcode.com/gh_mirrors/lr/lrc-maker 还在为制作歌词同步而烦恼吗&#x…...

华硕笔记本性能优化终极指南:G-Helper轻量控制工具完整解析

华硕笔记本性能优化终极指南&#xff1a;G-Helper轻量控制工具完整解析 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenboo…...

厂房分区控温需求,水冷空调按需布设灵活调配

在工业生产与商业运营中&#xff0c;高温作业环境长期困扰着企业和劳动者。一方面&#xff0c;传统中央空调的高昂安装与运营成本让大多数中小企业望而却步&#xff1b;另一方面&#xff0c;超大厂房、物流仓库、汽车制造车间等开放或半开放场景&#xff0c;难以实现完全密封&a…...

中关村、首体院、京奥电竞三方签约,共探AI+电竞产学研一体化突破

AI电竞&#xff1a;三方签约开启产学研新篇在今日的大会上&#xff0c;中关村人工智能研究院、首都体育学院、京奥电竞&#xff08;北京&#xff09;科技有限公司举行了一场重量级的三方签约。中关村人工智能研究院专注于具有产业价值和颠覆意义的人工智能与交叉学科领域探索&a…...

LimboAI:Godot 4原生行为树+黑板+状态机AI框架实战指南

1. 这不是又一个“AI插件”&#xff0c;而是Godot 4里真正能跑通行为树黑板状态机闭环的AI开发框架我第一次在Godot 4.2项目里把LimboAI的BTTaskMoveTo节点拖进行为树编辑器、连上BlackboardKey、再绑定到一个带NavigationAgent3D的NPC身上&#xff0c;按下F5运行——那个角色真…...

ARGUS:视觉中心化多模态推理框架,实现像素级可验证Chain-of-Thought

1. 项目概述&#xff1a;这不是又一个“多模态大模型”&#xff0c;而是一次视觉推理范式的重新校准ARGUS这个名字&#xff0c;乍看像某个军事侦察系统代号&#xff0c;其实它精准指向了当前多模态AI领域最棘手的痛点——视觉信息在推理链中长期处于“失语”状态。你肯定见过这…...

Go HTTP Router 深度解析:从原理到实战

Go HTTP Router 深度解析&#xff1a;从原理到实战 引言 在Go语言的Web开发中&#xff0c;Router是核心组件之一。高效的路由系统能够显著提升Web应用的性能和可维护性。本文将深入探讨Go语言HTTP Router的实现原理&#xff0c;并通过实战案例展示如何构建高性能的路由系统。 一…...