装饰模式Decorator Pattern

模式定义

动态地给对象增加额外的职责

  • 对象结构型模式

模式结构

  • Component:抽象构件
  • ConcreteComponent: 具体构件
  • Decorator:抽象装饰类
  • ConcreteDecorator: 具体装饰类
抽象装饰类代码
public class Decorator extends Component {private Component component;public Decorator(Component component) {this.component = component;}public void operation() {component.operation();}}

具体装饰类代码

public class ConcreteDecorator extends Decorator {Object addedState; // 新增属性public ConcreteDecorator(Component component) {super(component);}public void operation() {super.operation();addedBehavior();}// 新增方法public void addedBehavior() {// do something}}
  • 一个装饰类的接口必须与被装饰类的接口保持相同
    • 对于客户端来说无论是装饰之前的对象还是装饰之后的对象都可以一致对待
  • 尽量保持具体构件类Component作为一个“轻”类
    • 不要把太多的逻辑和状态放在具体构件类中可以通过装饰类对其进行扩展

简化装饰模式

如果只有一个具体构件类而没有抽象构件类,那么抽象装饰类可以作为具体构件类的直接子类

透明装饰模式

客户端完全面向抽象编程

  • 客户端不声明具体构件类型和具体装饰类型,而全部声明为抽象构件类型

半透明装饰模式

客户端面向抽象构件类型具体装饰类型编程

  • 客户端可以声明具体装饰者类型对象,调用具体装饰者中新增方法

实例

某系统提供了一个数据加密功能,可以对字符串进行加密。最简单的加密算法通过对字母进行移位来实现,同时还提供了稍复杂的逆向输出加密,还提供了更为高级的求模加密。用户先使用最简单的加密算法对字符串进行加密,如果觉得还不够可以对加密之后的结果使用其他加密算法进行二次加密,当然也可以进行第三次加密。现使用装饰模式设计该多重加密系统。

模式分析

  • 优点
    • 提供比继承更多的灵活性以扩展对象功能
    • 通过配置文件在运行时选择不同的装饰器以动态扩展对象功能
    • 具体构件类和具体装饰类可以独立变化
      • 符合开闭原则
  • 缺点
    • 增加系统的复杂度
    • 比继承更加易于出错,排错困难

适用环境

  • 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责
  • 需要动态地给一个对象增加功能,这些功能也可以动态地被撤销
  • 当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时
    • 系统中存在大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长
    • 不能继承的类定义(如final类)

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

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

相关文章

https说明

http是无状态的,https是在http应用层协议和tcp传输控制层之间加了一层,主要功能包括加密传输内容,校验信息是否完整,信息是否被篡改等。http的网络传输,源端应用层发送http请求,传输到源端的控制层&#xf…

实时操作系统(FreeRTOS、RT-Thread)RISC-V

FreeRTOS:FreeRTOS™ - FreeRTOS™ RT-Thread:rt-thread.org VxWorks: QNX Neutrino RTOS: RT-Linux: 一、 实时操作系统介绍 实时操作系统(Real Time Operating System,简称RTOS&#xff…

Python3除标准库外更全面的XML解析方案

一、扩展解析库方案 lxml高性能解析 from lxml import etree doc etree.parse(data.xml) # XPath 2.0增强查询 nodes doc.xpath(//student[score>90]/name/text())优势:支持XPath 2.0语法和XSLT转换,比标准库快5-10倍 BeautifulSoup混合解析 fr…

同时装两个MySQL, 我在MySQL5的基础上, 安装MySQL8

目录 1. 前言 2. 下载MySQL 3. 安装MySQL 3.1 第一步:选择MySQL ​编辑 3.2 第二步:存储地址 3.3 第三步 3.4 第四步:完成基础配置 3.5 第五步 3.6 第六步:数据库密码 3.7 第七部:服务名 4. 环境变量 4.1 复制MySQL的bin地址 4.2 进入高级系统设置 4.3 PATH 4.4 更改…

Visual Studio 2022打包程序流程

Visual Studio 2022打包程序流程 打开管理拓展 安装Microsoft Visual Studio Installer Projects 关闭软件才能继续安装 安装完成后点击,解决方案,创建新项目 添加:setup project 打开软件的路径 复制路径 添加文件 粘贴刚才复制的路径&…

web3方法详解

web3.py 是一个功能强大的 Python 库,用于与以太坊区块链交互。它提供了多种模块和功能,涵盖账户管理、智能合约交互、交易发送、区块链数据查询等。以下是 web3.py 的主要功能模块及其用途: 1. Web3 核心模块 功能:提供基础连接、工具函数和核心功能。 常用方法: Web3(…

HTML5+JS实现一个简单的SVG 贝塞尔曲线可视化设计器,通过几个点移动位置,控制曲线的方向

三次贝塞尔曲线,二次贝塞尔曲线有什么区别 https://blog.csdn.net/xiaoyao961/article/details/148678265 SVG 贝塞尔曲线可视化设计器 下面是一个简单的贝塞尔曲线可视化设计器,使用 HTML5 和 JavaScript 实现。这个设计器允许你通过拖动控制点来实时调整贝塞尔曲…

Pytorch框架——自动微分和反向传播

一、自动微分概念 自动微分(Automatic Differentiation,AD)是一种利用计算机程序自动计算函数导数的技术,它是机器学习和优化算法中的核心工具(如神经网络的梯度下降),通过反向传播计算并更新梯…

【Linux手册】进程的状态:从创建到消亡的“生命百态”

目录 前言 操作系统进程状态 运行状态 阻塞状态 挂起状态 Linux中具体的进程状态 R(running)运行状态 S(sleeping)阻塞状态 D(disk sleep)磁盘休眠状态 T(stopped)和t(tracing stop) X(dead)终止状态 Z(zombie)僵尸状态 僵尸进程的危害 前言 我们在运行可执行程序…

李沐--动手学深度学习 LSTM

1.从零开始实现LSTM #从零开始实现长短期记忆网络 import torch from torch import nn from d2l import torch as d2l#加载时光机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps)#1.定义和初始化模型参数&#xff…

面经的疑难杂症

1.介绍一下虚拟地址,虚拟地址是怎么映射到物理地址的? 虚拟地址是指在采用虚拟存储管理的操作系统中,进程访问内存时所使用的地址。每个进程都有独立的虚拟地址空间,虚拟地址通过操作系统和硬件(如MMU,内存…

去噪扩散概率模型(DDPM)全解:从数学基础到实现细节

一、 概述 在这篇博客文章中,我们将深入探讨去噪扩散概率模型(也被称为 DDPMs,扩散模型,基于得分的生成模型,或简称为自动编码器),这可以说是AIGC最近几年飞速发展的基石,如果你想做…

【系统分析师】2011年真题:案例分析-答案及详解

文章目录 试题1【问题 1】【问题 2】【问题 3】 试题2【问题 1】【问题 2】【问题 3】 试题3【问题 1】【问题 2】【问题 3】 试题4【问题 1】【问题 2】【问题 3】 试题5【问题 1】【问题 2】【问题 3】 试题1 随着宽带应用快速发展,用户要求系统服务提供商提供基…

【unitrix】 1.7 规范化常量类型结构(standardization.rs)

一、源码 这段代码实现了一个二进制数字标准化系统,用于将二进制数字类型(B0/B1)转换为更简洁的表示形式。 //! 二进制数字标准化模块 / Binary Number Normalization Module //! //! 提供将二进制数字(B0/B1)标准化为更简洁表示形式的功能…

NJet Portal 应用门户管理介绍

nginx向云原生演进,All in OpenNJet! 1. 应用门户简介 NJet 应用引擎是基于 Nginx 的面向互联网和云原生应用提供的运行时组态服务程序,作为底层引擎,NJet 实现了NGINX 云原生功能增强、安全加固和代码重构,利用动态加…

uni-app学习笔记三十六--分段式选项卡组件的使用

先来看效果: 上图有3个选项卡(PS:uniapp官方称之为分段器,我还是习惯叫选项卡),需要实现点击不同的选项卡时下方切换显示对应的数据。 下面介绍下实现的过程。 1.在uniapp官方文档下载并安装该扩展组件:u…

Qt:Qt桌面程序正常退出注意事项

一般情况下,Qt窗体的创建和显示命令如下: Main_window main_window; main_window.show(); 主窗体中设置属性Qt::WA_DeleteOnClose setAttribute(Qt::WA_DeleteOnClose); 则在main.cpp中可以将窗体创建为指针,这样在退出时可以正确释放指针…

【arXiv2024】时间序列|TimesFM-ICF:即插即用!时间序列预测新王者!吊打微调!

论文地址:https://arxiv.org/pdf/2410.24087 代码地址:https://github.com/uctb/TSFM 为了更好地理解时间序列模型的理论与实现,推荐参考UP “ThePPP时间序列” 的教学视频。该系列内容系统介绍了时间序列相关知识,并提供配套的论…

从0开始学习语言模型--Day02-如何最大化利用硬件

如何利用硬件 这个单元分为内核、并行处理和推理。 内核(Kernels) 我们说的内核一般指的就是GPU,这是我们用于计算的地方,一般说的计算资源就指的是GPU的大小。我们模型所用的数据和参数一般存储在内存里,假设把内存…

ElasticSearch配置详解:设置内存锁定的好处

什么是内存锁定 "bootstrap": {"memory_lock": "true" }内存锁定是指将Elasticsearch的JVM堆内存锁定在物理内存中,防止操作系统将其交换(swap)到磁盘。 内存交换是操作系统的虚拟内存管理机制,当…