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

Java设计模式之装饰器模式:从入门到架构级实践

一、开篇:为什么需要装饰器模式?

在软件开发中,我们经常面临这样的困境:如何在不修改原有对象结构的情况下,动态地扩展对象的功能?当系统需要为对象添加多种可能的扩展功能时,如果直接使用继承,会导致类爆炸问题(Class Explosion)。装饰器模式(Decorator Pattern)正是为解决这类问题而生的经典设计模式。

核心价值

  • 遵循开闭原则(对扩展开放,对修改关闭)

  • 实现功能的动态组合

  • 避免多层继承带来的复杂性

二、装饰器模式本质解析

2.1 模式定义

装饰器模式通过将对象放入包含行为的特殊封装对象中,为原对象动态添加新的行为。这种模式创建了一个装饰器类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

2.2 核心角色

  1. Component(抽象组件)

    • 定义对象的接口,可以是抽象类或接口

    • 示例:InputStream(Java IO体系中的抽象组件)

  2. ConcreteComponent(具体组件)

    • 实现Component接口的具体对象

    • 示例:FileInputStream

  3. Decorator(抽象装饰器)

    • 继承/实现Component,并持有Component的引用

    • 示例:FilterInputStream

  4. ConcreteDecorator(具体装饰器)

    • 实现具体的装饰逻辑

    • 示例:BufferedInputStream

2.3 实现原理

// 抽象组件
public interface DataSource {void writeData(String data);String readData();
}// 具体组件
public class FileDataSource implements DataSource {// 基础实现...
}// 抽象装饰器
public abstract class DataSourceDecorator implements DataSource {protected DataSource wrappee;public DataSourceDecorator(DataSource source) {this.wrappee = source;}
}// 加密装饰器
public class EncryptionDecorator extends DataSourceDecorator {public EncryptionDecorator(DataSource source) {super(source);}@Overridepublic void writeData(String data) {String encrypted = encrypt(data);wrappee.writeData(encrypted);}private String encrypt(String data) {// AES加密实现...return encryptedData;}
}

三、架构级应用实践

3.1 Java IO流经典实现

Java IO库是装饰器模式的教科书级实现:

// 多层装饰示例
InputStream in = new BufferedInputStream(new GZIPInputStream(new FileInputStream("test.gz")));
  • FileInputStream:具体组件(读取文件)

  • GZIPInputStream:具体装饰器(解压功能)

  • BufferedInputStream:具体装饰器(缓冲功能)

3.2 Spring框架中的应用

在Spring的Bean装饰处理中:

public class TransactionalDecorator implements ApplicationContextAware {private ApplicationContext context;public Object decorate(Object bean) {return Proxy.newProxyInstance(bean.getClass().getClassLoader(),bean.getClass().getInterfaces(),(proxy, method, args) -> {// 开启事务TransactionStatus status = beginTransaction();try {Object result = method.invoke(bean, args);commitTransaction(status);return result;} catch (Exception e) {rollbackTransaction(status);throw e;}});}
}

3.3 日志增强的优雅实现

public class LoggingDecorator implements UserService {private UserService wrappee;private Logger logger = LoggerFactory.getLogger(getClass());public LoggingDecorator(UserService service) {this.wrappee = service;}@Overridepublic User getUser(Long id) {logger.info("Accessing user with ID: {}", id);long start = System.currentTimeMillis();User user = wrappee.getUser(id);logger.debug("User retrieval took {} ms", System.currentTimeMillis() - start);return user;}
}

四、进阶应用技巧

4.1 动态装饰策略

通过组合模式实现动态功能组合:

public class DynamicDecorator {private List<Consumer<String>> processors = new ArrayList<>();public DynamicDecorator addProcessor(Consumer<String> processor) {processors.add(processor);return this;}public String process(String input) {String result = input;for (Consumer<String> processor : processors) {result = processor.apply(result);}return result;}
}// 使用示例
new DynamicDecorator().addProcessor(s -> s.toUpperCase()).addProcessor(s -> s.replace(" ", "_")).process("hello world"); // 返回"HELLO_WORLD"

4.2 多层嵌套装饰

处理复杂业务逻辑时,可以嵌套多个装饰器:

DataSource source = new CompressionDecorator(new EncryptionDecorator(new FileDataSource("data.txt")));

4.3 与工厂模式结合

创建装饰器的工厂类:

public class DataSourceFactory {public static DataSource createDataSource(boolean needEncrypt, boolean needCompress) {DataSource ds = new FileDataSource();if (needEncrypt) ds = new EncryptionDecorator(ds);if (needCompress) ds = new CompressionDecorator(ds);return ds;}
}

五、模式对比与最佳实践

5.1 与代理模式的区别

特性装饰器模式代理模式
目的增强功能控制访问
创建时机运行时动态添加编译时确定
调用关系装饰器调用被装饰对象代理直接处理请求
关注点功能扩展访问控制、延迟初始化等

5.2 最佳实践原则

  1. 接口优先原则:装饰器和组件应实现相同的接口

  2. 单一职责原则:每个装饰器只完成单一功能增强

  3. 透明性原则:装饰后的对象应该可以完全替代原对象

  4. 适度使用原则:当装饰层级超过3层时需考虑设计合理性

六、生产环境中的注意事项

  1. 调试复杂性
    多层装饰可能增加调试难度,建议为每个装饰器添加唯一标识

  2. 性能考量
    深度装饰链可能影响性能,必要时进行性能测试

  3. 序列化问题
    被装饰对象实现Serializable时,需要特别处理装饰器

  4. 内存泄漏预防
    确保装饰器与被装饰对象的生命周期管理一致

七、典型应用场景

  1. 动态功能组合:如电商系统的折扣叠加计算

  2. 中间件增强:数据库连接池的监控、超时处理

  3. AOP替代方案:在不能使用Spring AOP的场景下实现切面功能

  4. 协议处理链:网络框架中的编解码处理

  5. UI组件扩展:GUI控件的事件监听增强

八、架构层面的思考

在微服务架构中,装饰器模式可以延伸为:

  • API网关的过滤器链(类似Servlet Filter)

  • 分布式跟踪的上下文装饰

  • 服务容错装饰器(熔断、降级)

  • 缓存装饰器(Redis+DB的混合访问)

public class CircuitBreakerDecorator implements OrderService {private OrderService service;private CircuitBreaker breaker;public CircuitBreakerDecorator(OrderService service) {this.service = service;this.breaker = CircuitBreaker.create();}@Overridepublic Order createOrder(OrderRequest request) {return breaker.run(() -> service.createOrder(request));}
}

九、总结与展望

装饰器模式的核心价值在于其动态扩展能力,这种能力在现代软件架构中尤为重要。随着云原生架构的普及,装饰器模式在以下领域有更大发展空间:

  1. Serverless架构中的中间件实现

  2. Service Mesh的Sidecar模式

  3. 函数式编程的Pipeline处理

  4. 可观测性体系的埋点装饰

关键收获

  • 装饰器模式是开闭原则的最佳实践

  • 通过组合替代继承,实现更灵活的功能扩展

  • 在框架设计和架构层面具有重要应用价值

最后需要强调的是:任何设计模式的运用都需要把握适度原则,当发现装饰器被过度使用时,应该考虑是否需要进行架构重构,或者采用责任链模式等其他模式进行优化。

相关文章:

Java设计模式之装饰器模式:从入门到架构级实践

一、开篇&#xff1a;为什么需要装饰器模式&#xff1f; 在软件开发中&#xff0c;我们经常面临这样的困境&#xff1a;如何在不修改原有对象结构的情况下&#xff0c;动态地扩展对象的功能&#xff1f;当系统需要为对象添加多种可能的扩展功能时&#xff0c;如果直接使用继承…...

Vue3性能优化全攻略:从原理到极致性能实战

一、性能瓶颈深度诊断 1.1 关键性能指标分析 1.2 性能剖析工具矩阵 工具类型典型工具适用场景检测维度综合检测工具Lighthouse首屏加载性能分析加载评分/优化建议运行时监控工具Web Vitals页面交互性能监控FCP/LCP/TTI等框架专项工具Vue Devtools组件渲染性能分析渲染耗时/更…...

阿里云 AI 搜索开放平台:从算法到业务——AI 搜索驱动企业智能化升级

——已获知乎作者【GitHub Daily】授权转载 目前大模型的强大能力&#xff0c;使其成为一些企业和行业的主要创新驱动力&#xff0c;企业亟需重新审视和调整现有的创新机制&#xff0c;以适应AI技术和大数据的快速发展。目前很多企业已经开始尝试大模型在业务中进行赋能&#x…...

特权FPGA之AT24C02 IIC实现

0 简介 IIC的物理层 IIC一共有只有两个总线&#xff1a; 一条是双向的串行数据线&#xff33;&#xff24;&#xff21;&#xff0c;一条是串行时钟线&#xff33;&#xff23;&#xff2c;. SDA(Serial data)是数据线&#xff0c;D代表Data也就是数据&#xff0c;Send Data …...

Docker 容器内运行程序的性能开销

在 Docker 容器内运行程序通常会有一定的性能开销&#xff0c;但具体损失多少取决于多个因素。以下是详细分析&#xff1a; 1. CPU 性能 理论开销&#xff1a;容器直接共享宿主机的内核&#xff0c;CPU 调度由宿主机管理&#xff0c;因此 CPU 运算性能几乎与原生环境一致&…...

SpringBoot依赖冲突引发的 log4j 日志打印问题及解决方法

依赖冲突引发的 log4j 日志打印问题及解决方法 在软件开发过程中&#xff0c;依赖管理是至关重要的一环。然而&#xff0c;时常会遇到依赖冲突的情况&#xff0c;其中就包括影响日志框架正常使用&#xff0c;比如因依赖冲突导致无法正常打印 log4j 日志的问题。 问题描述 当…...

MacOS中的鼠标、触控板的设置研究

一、背景和写这篇文章的原因 想搞清楚和配置好鼠标&#xff0c;比如解决好为什么我的滚动那么难用&#xff1f;怎么设置滚轮的方向跟windows相同&#xff1f;调整双击速度&#xff0c;调整鼠标滚轮左右拨动的"冷却时间"。 二、各种设置之详细解释 1. MacOS设置 -&…...

Clickhouse试用单机版部署

问题 最近需要试用clklog数据收集的社区版&#xff0c;clklog用数据库是Clickhouse。这就需要我先单机部署一个Clickhouse数据库&#xff0c;先试用试用。 步骤 这里假设我们已经拥有一台Ubuntu的服务器了&#xff0c;现在我们需要在这台机器上面安装Clickhouse数据库。Clic…...

【运维 | 硬件】服务器中常见的存储插槽类型、对应的传输协议及其特性总结

Why&#xff1a;最近更换设备&#xff0c;具体了解一下。 传输协议对比 协议 底层接口 最大带宽 队列深度 典型延迟 适用场景 AHCI SATA 6 Gbps (~600 MB/s) 单队列&#xff08;32命令&#xff09; 较高 传统 HDD/SATA SSD SAS SAS 24 Gbps (~2.4 GB/s) 单队列&…...

本地laravel项目【dcat-admin】部署到liunx服务器

文章目录 前言一、部署流程1、数据库搬迁2、宝塔创建网站&#xff0c;配置php3、修改nginx配置4、在public目录设置软连接5、修改env配置、刷新缓存 二、其他问题1.后台登陆失败问题2.完美解决接口跨域问题 总结 前言 laravel新手记录 差不多一个月&#xff0c;总算用laravel…...

DeepSeek:AI如何重构搜索引擎时代的原创内容生态

一、当生成式AI遇上搜索引擎&#xff1a;一场效率与价值的博弈 2023年&#xff0c;全球搜索引擎处理了超过2万亿次查询&#xff0c;其中超40%涉及复杂问题解答。而与此同时&#xff0c;Google的"Helpful Content Update"算法升级直接淘汰了26%的低质AI生成页面。这场…...

在docker里装rocketmq-console

首先要到github下载&#xff08;这个一般是需要你有梯子&#xff09; GitHub - apache/rocketmq-externals at release-rocketmq-console-1.0.0 如果没有梯子&#xff0c;用下面这个百度网盘链接下 http://链接: https://pan.baidu.com/s/1x8WQVmaOBjTjss-3g01UPQ 提取码: fu…...

蓝桥杯C++组算法知识点整理 · 考前突击(上)【小白适用】

【背景说明】本文的作者是一名算法竞赛小白&#xff0c;在第一次参加蓝桥杯之前希望整理一下自己会了哪些算法&#xff0c;于是有了本文的诞生。分享在这里也希望与众多学子共勉。如果时间允许的话&#xff0c;这一系列会分为上中下三部分和大家见面&#xff0c;祝大家竞赛顺利…...

Docker 是什么? Docker 基本观念介绍与容器和虚拟机的比较

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;历代文学&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编程&#xff0c;高并发设计&#xf…...

Docker:安装与部署 Nacos 的技术指南

1、简述 Nacos(Dynamic Naming and Configuration Service)是阿里巴巴开源的一个动态服务发现、配置管理和服务治理的综合解决方案,适用于微服务架构。 Nacos 主要功能: 服务发现与注册:支持 Dubbo、Spring Cloud 等主流微服务框架的服务发现与注册。动态配置管理:支持…...

UE5 RPC调用示例详解

文章目录 前言一、示例场景二、代码实现三、关键点解析3.1 RPC类型选择3.2 可靠性设置3.3 权限控制3.4 输入处理 四、测试与验证总结 前言 在UE5中&#xff0c;RPC&#xff08;远程过程调用&#xff09;是实现多人游戏逻辑同步的核心机制。以下通过一个玩家跳跃的示例&#xf…...

MATLAB在工程领域的实际应用案例

文章目录 前言自动驾驶汽车路径规划系统汽车先进驾驶辅助系统&#xff08;ADAS&#xff09;开发控制电气系统设计与优化桥梁结构分析与安全性评估 前言 MATLAB 在工程领域应用广泛&#xff0c;能解决复杂问题、优化系统设计。下面从不同工程领域选取了具有代表性的案例&#x…...

【完美解决】VSCode连接HPC节点,已配置密钥却还是提示需要输入密码

目录 问题描述软件版本原因分析错误逻辑链 解决方案总结 问题描述 本人在使用 ​​VSCode Remote-SSH 插件​​连接超算集群节点时&#xff0c;遇到以下问题&#xff1a;已正确配置 SSH 密钥&#xff0c;且 VSCode 能识别密钥文件&#xff08;如图1&#xff09;&#xff0c;但在…...

智能物联网网关策略部署

实训背景 某智慧工厂需部署物联网网关&#xff0c;实现以下工业级安全管控需求&#xff1a; 设备准入控制&#xff1a;仅允许注册MAC地址的传感器接入&#xff08;白名单&#xff1a;AA:BB:CC:DD:EE:FF&#xff09;。协议合规性&#xff1a;禁止非Modbus TCP&#xff08;端口…...

玩转代理 IP :实战爬虫案例

在现代互联网环境下&#xff0c;爬虫不仅是数据获取的利器&#xff0c;也成为应对网站反爬机制的技术博弈。而在这场博弈中&#xff0c;"代理 IP" 是核心武器之一。本文将以高匿名的代理ip为核心&#xff0c;结合 Python 实战、代理策略设计、高匿技巧与反封锁优化&a…...

Deepseek解锁科研绘图新方式

在科研领域&#xff0c;一张清晰、准确且美观的图片往往能比冗长的文字更有效地传达研究成果。从展示实验数据的图表&#xff0c;到阐述理论模型的示意图&#xff0c;科研绘图贯穿于研究的各个环节。然而&#xff0c;传统的科研绘图工具往往操作复杂&#xff0c;学习成本高&…...

【unity游戏开发入门到精通——动画篇】Animator反向动力学(IK)

考虑到每个人基础可能不一样&#xff0c;且并不是所有人都有同时做2D、3D开发的需求&#xff0c;所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】&#xff1a;主要讲解C#的基础语法&#xff0c;包括变量、数据类型、运算符、…...

【JavaScript】十八、页面加载事件和页面滚动事件

文章目录 1、页面加载事件1.1 load1.2 DOMContentLoaded 2、页面滚动事件2.1 语法2.2 获取滚动位置 3、案例&#xff1a;页面滚动显示隐藏侧边栏 1、页面加载事件 script标签在html中的位置一般在</body>标签上方&#xff0c;这是因为代码从上往下执行&#xff0c;在htm…...

Solana链开发全景指南:从环境搭建到生态实践

——2025年高性能区块链开发技术栈深度解析 一、Solana核心优势与技术特性 1. 突破性技术架构 历史证明&#xff08;PoH&#xff09;&#xff1a;通过时间戳序列化交易&#xff0c;实现并行处理能力&#xff0c;支持5万TPS的吞吐量 并行执行引擎&#xff08;Sealevel&#xf…...

这是一个文章标题

# Markdown 全语法示例手册本文档将全面演示 Markdown 的语法元素&#xff0c;包含 **标题**、**列表**、**代码块**、**表格**、**数学公式** 等 18 种核心功能。所有示例均附带实际应用场景说明。---## 一、基础文本格式### 1.1 标题层级 markdown # H1 (使用 #) ## H2 (使用…...

预言机与数据聚合器:DeFi的数据桥梁与风险博弈

一、核心机制与价值定位 预言机&#xff08;Oracle&#xff09;与数据聚合器是DeFi生态的“数据基建层”&#xff0c;解决链上-链下数据互通与链上数据可读性两大问题&#xff1a; 数据输入层&#xff08;预言机&#xff09;&#xff1a;将现实世界数据&#xff08;价格、天气…...

通过百度OCR在线API识别带水印扫描图片文字

目录 0 环境准备 1 百度OCR API申请 1.1 登录百度智能云 1.2 创建应用 1.3 获取API key和secret key 2 创建项目python环境 2.1 conda创建python环境 2.2 在pycharm中创建项目 2.3 激活python环境 2.4 安装项目依赖包 3 程序逻辑实现 3.1 导入依赖包 3.2 定义百度k…...

ocr python库

ocr python库 上手Git、Gitee和Github&#xff01;watt toolkit...

Node 处理 request 的过程中,都会更新哪些 metadata 和 property

什么是 Metadata&#xff1f; 用于描述帧状态、控制参数、处理结果等 是随 request 流动的结构&#xff0c;通常是 PerFrameMetaData&#xff0c;每一帧一份 属于 HAL3 metadata 树的组成部分 什么是 Property&#xff1f; 是 CamX 内部定义的一种帧级别的轻量信息块 不一…...

基于labview的多功能数据采集系统

基于labview的多功能数据采集系统&#xff08;可定制功能&#xff09; 包含基于NI温度采集卡。电流采集卡。电压采集卡的数据采集功能 数据存储 报表存储 数据处理与分析 生产者消费者架构 有需要可联系...

李沐《动手学深度学习》 | 线性神经网络-线性回归

文章目录 线性回归1.确定模型2.衡量预估质量-损失函数3.深度学习的基础优化算法随机梯度下降小批量随机梯度下降 从线性回归到深度网络 线性回归从0开始实现构造一个人造数据集创建数据集可视化数据集 读取数据-随机抽取样本模型定义模型参数初始化定义模型定义损失函数定义优化…...

LabVIEW 中 “Flatten To Json String” VI 应用及优势

在 LabVIEW 开发涉及机器人数据等场景时&#xff0c;常需将数据以特定 JSON 格式输出。“Flatten To Json String” VI 在此过程中能发挥重要作用&#xff0c;相比 LabVIEW 系统自带的 JSON 处理方式&#xff0c;它具备独特优势。以下将介绍其获取、使用方法及相较系统自带方式…...

关于 Spring Boot 后端项目使用 Maven 打包命令、JAR/WAR 对比、内嵌服务器与第三方服务器对比,以及热部署配置的详细说明

以下是关于 Spring Boot 后端项目使用 Maven 打包命令、JAR/WAR 对比、内嵌服务器与第三方服务器对比&#xff0c;以及热部署配置的详细说明&#xff1a; 一、Maven 打包命令详解 1. 基础命令 1.1 清理并打包 mvn clean packageclean&#xff1a;删除 target 目录中的旧构建文…...

用labview写crc8校验

crc8校验有好几种&#xff0c;我这里写的是不带任何后缀的crc8。 首先&#xff0c;我们百度一下crc8的计算方式 一般搜索出来下面还有c语言写的crc8可以做为参考。 下面便是根据百度的计算方式写的crc8&#xff0c;已校验过&#xff0c;无问题。 写完后&#xff0c;可以输入下…...

阿里云CDN与DCDN主动推送静态资源至边缘服务器的ASP.NET WEB实例

一、CDN,需要调用PushObjectCache接口进行URL预热,以下是操作步骤: 1. 准备工作 首先,安装阿里云SDK NuGet包: Install-Package Aliyun.NET.SDK.CDN -Version 3.0.0 Install-Package Aliyun.NET.SDK.Core -Version 3.0.0 2. 创建ASP.NET Web页面代码 CDNPreheat.aspx…...

LangChain-提示模板 (Prompt Templates)

提示模板是LangChain的核心组件&#xff0c;用于构建发送给语言模型的输入。本文档详细介绍了提示模板的类型、功能和最佳实践。 概述 提示工程是使用大型语言模型的关键技术。通过精心设计的提示&#xff0c;可以显著提高模型的输出质量和相关性。LangChain的提示模板系统提…...

多线程中的互斥与同步

多线程中的互斥与同步 1. 互斥与同步的区别 互斥&#xff1a;确保某一资源在同一时刻只能被一个线程访问。其主要目的是保证资源的唯一性和排他性&#xff0c;但无法控制访问的顺序。同步&#xff1a;在互斥的基础上&#xff0c;进一步通过其他机制保证访问资源的有序性。 2…...

ValueError: Cannot handle batch sizes > 1 if no padding token is defined`

ValueError: Cannot handle batch sizes > 1 if no padding token is defined` batch sizes > 1 进行掩码填充:pad_token,eos_token 在处理自然语言处理任务时,尤其是在使用批量数据进行训练或推理时,经常需要对输入文本进行填充(padding),以确保每个输入序列具…...

Gemma 3模型:Google 开源新星,大语言模型未来探索

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《深度探秘&#xff1a;AI界的007》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、快速发展的AI世界&#xff1a;为何关注Gemma 3&#x…...

先占个日常,等会写。

引入一个重要的概念 “struct” &#xff08;译为中文&#xff1a;结构体&#xff09; 可用作设出比较复杂的一些变量类型 语法 &#xff1a;struct point name { int x; int y; int z;} point 和 name是任意命名的名字&#xff0c;含义是&#xff0c;声明一个变量类型为st…...

PyTorch Tensor维度变换实战:view/squeeze/expand/repeat全解析

本文从图像数据处理、模型输入适配等实际场景出发&#xff0c;系统讲解PyTorch中view、squeeze、expand和repeat四大维度变换方法。通过代码演示对比不同方法的适用性&#xff0c;助您掌握数据维度调整的核心技巧。 一、基础维度操作方法 1. view&#xff1a;内存连续的形状重…...

212、【图论】字符串接龙(Python)

题目描述 题目链接&#xff1a;110. 字符串接龙 代码实现 import collectionsn int(input()) beginStr, endStr input().split() strList [input() for _ in range(n)]deque collections.deque() # 使用队列遍历结点 deque.append([beginStr, 1]) # 存储当前字符串和遍…...

土堆教程笔记【PyTorch】

官网&#xff1a;torch — PyTorch 2.6 documentation Pycharm 解释器 一般搞深度学习都用虚拟环境的解释器&#xff0c;为了满足不同的项目所需要的不同的包的版本。 1. system interpreter表示本地的解释器 也就是你电脑系统里安装的解释器 2. Virtual Environment—Py…...

【今日三题】小乐乐改数字 (模拟) / 十字爆破 (预处理+模拟) / 比那名居的桃子 (滑窗 / 前缀和)

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;每日两三题 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 小乐乐改数字 (模拟)十字爆破 (预处理模拟&#xff09;比那名居的桃子 (滑窗 / 前缀和) 小乐乐改数字 (模拟) 小乐乐改数字…...

各类神经网络学习:(九)注意力机制(第1/4集),背景介绍,以及理解与引入

上一篇下一篇GRU&#xff08;下集&#xff09;注意力机制&#xff08;第2/4集&#xff09; Attention&#xff08;注意力机制&#xff09; 又叫做: attention pooling 简单来说&#xff0c;就是在训练的过程中&#xff0c;已知哪些东西更重要&#xff0c;哪些东西次重要。从而更…...

微软出品的AI Toolkit,在VS Code中使用DeepSeek

文章目录 简介调用DeepSeek 简介 AI Toolkit是微软出品的VS Code智能插件&#xff0c;整合了多种AI大模型&#xff0c;使之可以在VS Code中调用。 在插件栏搜索【AI Toolkit for Visual Studio Code】即可安装。安装完成后&#xff0c;左侧活动栏中会出现【AI Toolkit】的图标…...

随机森林与决策树

随机森林 vs 决策树&#xff1a; 随机森林&#xff08;Random Forest&#xff09;和决策树&#xff08;Decision Tree&#xff09;都是经典的机器学习算法&#xff0c;但它们在原理、性能和适用场景上有显著差异。以下是关键对比&#xff1a; 1. 决策树&#xff08;Decision T…...

Selenium中`driver.get(htmlfile)`方法可能出现的超时问题

针对Selenium中driver.get(htmlfile)方法可能出现的超时问题&#xff0c;以下是几种改进方案及具体实现方法&#xff1a; 1. 设置页面加载超时时间 通过set_page_load_timeout()方法直接控制页面加载的最大等待时间。若超时&#xff0c;会抛出TimeoutException异常&#xff0c…...

selenium快速入门

一、操作浏览器 from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By# 设置选项 q1 Options() q1.add_argument("--no-sandbo…...

C++_智能指针

目录 一、智能指针的使用场景、基本概念 &#xff08;1&#xff09;因为抛异常而出现的资源泄漏的情况 二、RAII和智能指针的设计思路 三、c标准库智能指针以及使用 &#xff08;1&#xff09;几种智能指针的概念 auto_ptr unique_ptr shared_ptr weak_ptr 不是new出来…...