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

设计模式——装饰者模式(Decorator)

装饰者模式(Decorator Pattern)是一种结构型设计模式,它允许你动态地给一个对象添加一些额外的职责,就增加功能来说,装饰者模式相比生成子类更为灵活。在装饰者模式中,一个装饰类会包装一个对象(通常称为被装饰者),并为其添加一些新的功能。

装饰者模式包含以下几个角色:

  1. Component(抽象组件):定义一个对象接口,可以给这些对象动态地添加职责。
  2. ConcreteComponent(具体组件):实现Component接口,是装饰器可以装饰的对象。
  3. Decorator(抽象装饰器):继承自Component,持有对Component对象的引用,并定义与Component接口一致的接口。
  4. ConcreteDecorator(具体装饰器):实现Decorator接口,负责给Component添加职责。

装饰者模式的特点:

  • 装饰者和被装饰者对象有相同的超类型(接口或者抽象类)。
  • 你可以用一个或多个装饰者包装一个对象。
  • 装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的。
  • 对象可以在任何时候被装饰,所以可以在运行时动态地、不限量地用你喜欢的装饰者来装饰对象。

以下是一个简单的Java装饰者模式示例:

// 抽象组件(Component)
public interface Component {void operation();
}// 具体组件(ConcreteComponent)
public class ConcreteComponent implements Component {@Overridepublic void operation() {System.out.println("执行基础操作");}
}// 抽象装饰器(Decorator)
public abstract class Decorator implements Component {protected Component component;public Decorator(Component component) {this.component = component;}@Overridepublic void operation() {if (component != null) {component.operation();}}
}// 具体装饰器A(ConcreteDecoratorA)
public class ConcreteDecoratorA extends Decorator {public ConcreteDecoratorA(Component component) {super(component);}@Overridepublic void operation() {super.operation();addedFunctionA();}public void addedFunctionA() {System.out.println("为操作添加功能A");}
}// 具体装饰器B(ConcreteDecoratorB)
public class ConcreteDecoratorB extends Decorator {public ConcreteDecoratorB(Component component) {super(component);}@Overridepublic void operation() {super.operation();addedFunctionB();}public void addedFunctionB() {System.out.println("为操作添加功能B");}
}// 客户端(Client)
public class Client {public static void main(String[] args) {Component component = new ConcreteComponent();// 使用装饰器A包装ConcreteDecoratorA decoratorA = new ConcreteDecoratorA(component);decoratorA.operation(); // 执行基础操作,并添加功能A// 使用装饰器B包装装饰器AConcreteDecoratorB decoratorB = new ConcreteDecoratorB(decoratorA);decoratorB.operation(); // 执行基础操作,添加功能A,并再添加功能B}
}

在这个例子中,ConcreteComponent是具体组件,它实现了Component接口中的operation()方法。Decorator是抽象装饰器,它持有一个Component对象的引用,并提供了operation()方法的默认实现,即调用被装饰者的operation()方法。ConcreteDecoratorAConcreteDecoratorB是具体装饰器,它们分别添加了不同的功能(addedFunctionA()addedFunctionB())。在客户端代码中,你可以看到如何使用装饰器来动态地给对象添加职责。

相关文章:

设计模式——装饰者模式(Decorator)

装饰者模式(Decorator Pattern)是一种结构型设计模式,它允许你动态地给一个对象添加一些额外的职责,就增加功能来说,装饰者模式相比生成子类更为灵活。在装饰者模式中,一个装饰类会包装一个对象&#xff08…...

力扣:406. 根据身高重建队列

406. 根据身高重建队列 假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。 请你重新构…...

Docker 怎么将映射出的路径设置为非root用户权限

在Docker中,容器的根文件系统默认是由root用户拥有的。如果想要在映射到宿主机的路径时设置为非root用户权限,可以通过以下几种方式来实现: 1. 使用具有特定UID和GID的非root用户运行容器: 在运行容器时,你可以使用-u…...

Linux——进程的优先级、ACL

一、系统性能调优 Redhat7和centos7默认安装并启动了tuned服务 实验 [rootuser ~]# tuned-adm list //查看所有的调优方案 [rootuser ~]# tuned-adm recommend // 查看推荐的调优方案 virtual-guest 适用于作为虚拟机客户机运行的设备&#xff0…...

【C++】STL-list模拟实现

目录 1、本次需要实现的3个类即接口总览 2、list的模拟实现 2.1 链表结点的设置以及初始化 2.2 链表的迭代器 2.3 容量接口及默认成员函数 1、本次需要实现的3个类即接口总览 #pragma once #include<iostream> #include<assert.h> using namespace std; templ…...

Java 7大排序

&#x1f435;本篇文章将对数据结构中7大排序的知识进行讲解 一、插入排序 有一组待排序的数据array&#xff0c;以升序为例&#xff0c;从第二个数据开始&#xff08;用tmp表示&#xff09;依次遍历整组数据&#xff0c;每遍历到一个数据都再从tmp的前一个数据开始&#xff0…...

vue3 - 图灵

目录 vue3简介整体上认识vue3项目创建Vue3工程使用官方脚手架创建Vue工程[推荐] 主要⼯程结构 数据双向绑定vue2语法的双向绑定简单表单双向绑定复杂表单双向绑定 CompositionAPI替代OptionsAPICompositionAPI简单不带双向绑定写法CompositionAPI简单带双向绑定写法setup简写⽅…...

java设计模式八 享元

享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;它通过共享技术有效地支持大量细粒度的对象。这种模式通过存储对象的外部状态在外部&#xff0c;而将不经常变化的内部状态&#xff08;称为享元&#xff09;存储在内部&#xff0c;以此来减…...

ELK原理详解

ELK原理详解 一、引言 在当今日益增长的数据量和复杂的系统环境中&#xff0c;日志数据的收集、存储、分析和可视化成为了企业运营和决策不可或缺的一部分。ELK&#xff08;Elasticsearch、Logstash、Kibana&#xff09;堆栈凭借其高效的性能、灵活的扩展性和强大的功能&…...

多线程学习Day09

10.Tomcat线程池 LimitLatch 用来限流&#xff0c;可以控制最大连接个数&#xff0c;类似 J.U.C 中的 Semaphore 后面再讲 Acceptor 只负责【接收新的 socket 连接】 Poller 只负责监听 socket channel 是否有【可读的 I/O 事件】 一旦可读&#xff0c;封装一个任务对象&#x…...

第33次CSP认证Q1:词频统计

&#x1f344;题目描述 在学习了文本处理后&#xff0c;小 P 对英语书中的 &#x1d45b;n 篇文章进行了初步整理。 具体来说&#xff0c;小 P 将所有的英文单词都转化为了整数编号。假设这 &#x1d45b;n 篇文章中共出现了 &#x1d45a;m 个不同的单词&#xff0c;则把它们…...

pytorch加载模型出现错误

大概的错误长下面这样&#xff1a; 问题出现的原因&#xff1a; ​很明显&#xff0c;我就是犯了第一种错误。 网上的修改方法&#xff1a; 我觉得按道理哈&#xff0c;确实&#xff0c;蓝色部分应该是可以把问题解决了的​。​但是我没有解决&#xff0c;因为我犯了另外一个错…...

如何在Mac上恢复格式化硬盘的数据?

“嗨&#xff0c;我格式化了我的一个Mac硬盘&#xff0c;而没有使用Time Machine备份数据。这个硬盘被未知病毒感染了&#xff0c;所以我把它格式化为出厂设置。但是&#xff0c;我忘了备份我的文件。现在&#xff0c;我想恢复格式化的硬盘驱动器并恢复我的文档&#xff0c;您能…...

华为OD机试 - 手机App防沉迷系统(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…...

搜维尔科技:光学动作捕捉系统用于城市公共安全智慧感知实验室

用户名称&#xff1a;西安科技大学 主要产品&#xff1a;Optitrack Priime41 光学动作捕捉系统&#xff08;8头&#xff09; 在6米8米的空间内&#xff0c;通过8个Optitrack Priime41光学动作捕捉镜头&#xff0c;对人体动作进行捕捉&#xff0c;得到用户想要的人体三维空间坐…...

保研面试408复习 4——操作系统、计网

文章目录 1、操作系统一、文件系统中文件是如何组织的&#xff1f;二、文件的整体概述三、UNIX外存空闲空间管理 2、计算机网络一、CSMA/CD 协议&#xff08;数据链路层协议&#xff09;二、以太网MAC帧MTU 标记文字记忆&#xff0c;加粗文字注意&#xff0c;普通文字理解。 1、…...

实战攻防中关于文档的妙用

一、PPT钓鱼 简单制作一个用于钓鱼的PPTX文件 一般那种小白不知道PPT也能拿来钓鱼&#xff0c;这里主要是借用PPT中的”动作按钮”, 我们在插入的地方&#xff0c;选择“动作按钮” 然后在弹出的窗口处&#xff1a; 比如填入上线CS的语句&#xff1a;powershell.exe -nop -w …...

【使用ChatGPT的API之前】OpenAI API提供的可用模型

文章目录 一. ChatGPT基本概念二. OpenAI API提供的可用模型1. InstructGPT2. ChatGPT3. GPT-4 三. 在OpenAI Playground中使用GPT模型-ing 在使用GPT-4和ChatGPT的API集成到Python应用程序之前&#xff0c;我们先了解ChatGPT的基本概念&#xff0c;与OpenAI API提供的可用模型…...

【C语言】模拟实现深入了解:字符串函数

&#x1f525;引言 本篇将模拟实现字符串函数&#xff0c;通过底层了解更多相关细节 &#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;C笔记专栏&#xff1a; C笔记 &#x1f308;喜欢的诗句:无人扶我青云志 我自…...

钩子函数onMounted定义了太多访问MySQL的操作 导致数据库异常

先放几种后端遇到的异常&#xff0c;多数和数据库有关 pymysql.err.InternalError: Packet sequence number wrong - got 102 expected 1 127.0.0.1 - - [09/May/2024 17:49:37] "GET /monitorLastTenList HTTP/1.1" 500 AttributeError: NoneType object has no at…...

【LeetCode】50. pow(x,n) 题解

【LeetCode】50. pow(x,n)\text{pow}(x,n)pow(x,n) 题解 Link: https://leetcode.cn/problems/powx-n/ 实现 pow(x, n) &#xff0c;即计算 xxx 的整数 nnn 次幂函数&#xff08;即 xnx^nxn&#xff09;。 其中 xxx 是浮点数&#xff0c;nnn 是可正可负的 323232 位有符号整…...

CircuitPython微控制器图形保存实战:从屏幕截图到BMP文件生成

1. 项目概述&#xff1a;为什么我们需要在微控制器上保存图形&#xff1f; 在嵌入式开发领域&#xff0c;尤其是当我们使用像Adafruit PyPortal、PyGamer这类带有彩色显示屏的开发板时&#xff0c;图形界面的调试和内容存档一直是个不大不小的痛点。想象一下&#xff0c;你花了…...

设计师核心能力框架:从思维策略到工程落地的系统化成长路径

1. 项目概述&#xff1a;一个设计师的“内功”修炼场如果你是一名设计师&#xff0c;或者对设计工作感兴趣&#xff0c;那么你一定有过这样的时刻&#xff1a;面对一个设计任务&#xff0c;脑子里有无数想法&#xff0c;但打开软件却不知从何下手&#xff1b;或者看到别人的优秀…...

基于SpringBoot的汽车美容养护管理系统的设计与开发

一、选题依据和意义 &#xff08;一&#xff09;选题依据 随着国内汽车保有量持续攀升&#xff0c;汽车后市场规模不断扩大&#xff0c;汽车美容养护行业迎来快速发展期&#xff0c;但行业整体仍存在管理效率低下、服务流程不规范等问题[1]。传统管理模式依赖人工记录客户信息…...

基于HPM5E00与LAN9252的EtherCAT从站开发板全流程实战

1. 项目概述&#xff1a;从零到一&#xff0c;打造专属的 EtherCAT 从站开发板 最近在工业自动化圈子里&#xff0c;EtherCAT 的热度一直居高不下。它那近乎实时的通讯性能、灵活的拓扑结构&#xff0c;让它在运动控制、机器人、高端数控机床等领域成了“香饽饽”。但很多开发者…...

小学期学习报告-1

通过B站视频学习之后&#xff0c;我掌握冰设计出了555方波发生电路和低通滤波器&#xff0c;通过示波器可以看到&#xff0c;已经除了稳定的方波和正弦波 在这个过程中&#xff0c;根据公式T0.7*&#xff08; R12R2&#xff09;*C1&#xff0c;多次调整并得出稳定波形&#xff…...

基于英创ARM9嵌入式主板实现双CAN接口的硬件设计与Linux驱动配置实战

1. 项目概述&#xff1a;为什么需要双CAN接口&#xff1f; 在工业自动化、汽车电子、新能源设备这些领域里&#xff0c;CAN总线就像设备之间的“神经系统”&#xff0c;负责传递各种控制指令和状态数据。一个CAN接口是基础&#xff0c;但当你需要同时连接两个独立的CAN网络&…...

从RStudio到VSCode:5个场景教你如何高效使用vscode-R插件进行R开发

从RStudio到VSCode&#xff1a;5个场景教你如何高效使用vscode-R插件进行R开发 【免费下载链接】vscode-R R Extension for Visual Studio Code 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-R 你是否还在为RStudio的界面限制而烦恼&#xff1f;想要在更现代化的…...

告别依赖地狱:在Ubuntu 22.04 LTS上一步到位搞定ns-3.39所有可选库(保姆级命令清单)

告别依赖地狱&#xff1a;在Ubuntu 22.04 LTS上一步到位搞定ns-3.39所有可选库&#xff08;保姆级命令清单&#xff09; 当你第一次尝试运行ns-3的MPI分布式仿真时&#xff0c;是否遇到过mpi.h not found的报错&#xff1f;或是想在NetAnim中可视化网络拓扑&#xff0c;却因为…...

AI 写代码编译器却只给人看,Zero:一门给 Agent 设计的系统编程语言,让一切副作用显式可见

Vercel 的实验室最近放出一个叫 Zero 的东西&#xff0c;一门自称"给 Agent 用的系统编程语言"&#xff0c;2026 年 5 月刚发布 v0.1.1&#xff0c;编译器用 C 写的&#xff0c;文件后缀是 .0。单凭这个后缀&#xff0c;就知道这是一门不肯对任何既有生态妥协的新语言…...