【设计模式】【结构型模式】装饰者模式(Decorator)
👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD
🔥 2025本人正在沉淀中… 博客更新速度++
👍 欢迎点赞、收藏、关注,跟上我的更新节奏
🎵 当你的天空突然下了大雨,那是我在为你炸乌云
文章目录
- 一、入门
- 什么是装饰者模式?
- 为什么要装饰者模式?
- 怎样实现装饰者模式?
- 二、装饰者模式在框架源码中的实现
- Java I/O 流体系(最经典实现)
- Spring 框架中的装饰者应用
- 三、总结
- 装饰者模式的优点
- 装饰者模式的缺点
- 装饰者模式的适用场景
一、入门
什么是装饰者模式?
装饰者模式(Decorator Pattern)是 Java 中常用的结构型设计模式,它能在不修改原有对象结构的前提下,动态地为对象添加额外的职责。
为什么要装饰者模式?
假设你正在开发一个电商系统,需要处理订单的 基础价格 和 多种附加服务(如快递加急、礼品包装、保价服务等),且这些附加服务可以任意组合。
下面是没有用装饰者模式的代码实现:
// 基础订单
class BasicOrder { /* 计算基础价格 */ }// 各种组合继承(产生大量重复代码)
class BasicOrderWithExpress extends BasicOrder {} // 基础+快递
class BasicOrderWithGiftWrap extends BasicOrder {} // 基础+礼品
class BasicOrderWithExpressAndGiftWrap extends BasicOrder {} // 基础+快递+礼品
// ...更多组合(n种附加服务会产生2^n个子类!)
存在问题:
- 类数量指数级增长:3种附加服务需要7个子类,4种需要15个…
- 代码重复严重:每个子类都要重写价格计算方法
- 难以维护:新增一个附加服务(如保价),需要修改所有相关子类
- 无法动态组合:运行时不能灵活增减服务
怎样实现装饰者模式?
装饰者模式由以下构成:
- 组件接口(Component):定义核心功能的抽象。定义被装饰对象和装饰器的共同行为规范,声明核心业务方法(如价格计算、服务描述),确保装饰过程的透明性(客户端无需区分原始对象和装饰后的对象)
- 具体组件(ConcreteComponent):基础实现类。实现组件接口的基础功能,作为装饰过程的原始起点(最内层的被装饰对象),不应包含任何装饰逻辑
- 装饰器基类(Decorator):持有组件引用,实现组件接口
- 具体装饰器(ConcreteDecorator):添加具体增强功能
【案例】订单系统 - 改
组件接口:Order
接口
interface Order {double calculatePrice();String getDescription();
}
具体组件:基础订单,BasicOrder
类
class BasicOrder implements Order {public double calculatePrice() { return 100.0; } // 基础价格100元public String getDescription() { return "基础订单"; }
}
装饰器基类:OrderDecorator
类
// 装饰器基类(关键:实现相同接口)
abstract class OrderDecorator implements Order {protected Order decoratedOrder;public OrderDecorator(Order order) {this.decoratedOrder = order;}// 默认直接转发给被装饰对象public double calculatePrice() {return decoratedOrder.calculatePrice();}public String getDescription() {return decoratedOrder.getDescription();}
}
具体装饰器:ExpressDecorator
类(快递加急)、GiftWrapDecorator
类(礼品包装)、InsuranceDecorator
类(保价服务)
// 具体装饰器:快递加急
class ExpressDecorator extends OrderDecorator {public ExpressDecorator(Order order) {super(order);}public double calculatePrice() {return super.calculatePrice() + 25.0; // 加急费25元}public String getDescription() {return super.getDescription() + " + 快递加急";}
}// 具体装饰器:礼品包装
class GiftWrapDecorator extends OrderDecorator {public GiftWrapDecorator(Order order) {super(order);}public double calculatePrice() {return super.calculatePrice() + 15.0; // 包装费15元}public String getDescription() {return super.getDescription() + " + 礼品包装";}
}// 具体装饰器:保价服务
class InsuranceDecorator extends OrderDecorator {public InsuranceDecorator(Order order) {super(order);}public double calculatePrice() {return super.calculatePrice() + 30.0; // 保价费30元}public String getDescription() {return super.getDescription() + " + 保价服务";}
}
客户端使用
public class Client {public static void main(String[] args) {// 基础订单Order order = new BasicOrder();// 动态叠加服务(可任意组合)order = new ExpressDecorator(order); // 加急order = new GiftWrapDecorator(order); // 包装order = new InsuranceDecorator(order); // 保价System.out.println(order.getDescription());// 输出:基础订单 + 快递加急 + 礼品包装 + 保价服务System.out.println("总价:" + order.calculatePrice());// 输出:总价:170.0}
}
二、装饰者模式在框架源码中的实现
Java I/O 流体系(最经典实现)
InputStream in = new BufferedInputStream( // 具体装饰器new FileInputStream( // 具体组件new File("test.txt")));
源码中的实现:
组件接口(Component):InputStream
抽象类。
具体组件(ConcreteComponent):FileInputStream
类。
装饰器基类(Decorator):FilterInputStream
类。
具体装饰器(ConcreteDecorator):BufferedInputStream
类。
// 装饰器基类 FilterInputStream
public class FilterInputStream extends InputStream {protected volatile InputStream in; // 持有被装饰对象protected FilterInputStream(InputStream in) {this.in = in;}// 默认转发所有方法到被装饰对象public int read() throws IOException {return in.read();}
}// 具体装饰器 BufferedInputStream
public class BufferedInputStream extends FilterInputStream {private byte[] buf; // 新增缓冲区状态public BufferedInputStream(InputStream in) {super(in); // 必须传入被装饰对象buf = new byte[8192];}// 增强的读取方法(实现缓冲机制)public int read() throws IOException {if (pos >= count) {fill(); // 装饰器新增的核心逻辑if (pos >= count)return -1;}return getBufIfOpen()[pos++] & 0xff;}
}
Spring 框架中的装饰者应用
这里说的比较简单,后续我学到Spring源码再补充😁
典型场景:事务缓存装饰器
// 装饰器基类实现
public class TransactionAwareCacheDecorator implements Cache {private final Cache targetCache; // 被装饰的缓存对象public TransactionAwareCacheDecorator(Cache targetCache) {this.targetCache = targetCache;}// 在事务提交后才执行实际put操作public void put(final Object key, final Object value) {TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {public void afterCommit() {targetCache.put(key, value);}});}
}
- 装饰器注册:通过
CacheManager
包装原始缓存 - 事务感知:延迟缓存操作到事务提交后
- 与代理模式结合:常通过 AOP 动态应用装饰器
三、总结
装饰者模式的优点
- 动态扩展功能
- 无需修改原有代码,运行时动态添加功能
- 案例:
Java I/O
流中,BufferedInputStream
动态为FileInputStream
添加缓冲功能
- 避免类爆炸
- 相比继承,装饰者模式通过组合实现功能扩展,避免子类数量指数级增长
- 案例:电商订单系统中,3种附加服务只需3个装饰类,而不是7个子类
- 符合开闭原则
- 对扩展开放:新增装饰器不影响现有代码
- 对修改封闭:无需修改组件接口和具体组件
- 案例:Spring 的
TransactionAwareCacheDecorator
扩展缓存功能,不影响原有缓存实现
- 灵活组合
- 装饰器可以任意组合,实现不同功能叠加
- 案例:Netty 的
ChannelPipeline
中,多个ChannelHandler
可以按需组合
- 透明性
- 客户端无需区分原始对象和装饰后的对象
- 案例:
Java Collections
的unmodifiableList
返回相同接口类型,对客户端透明
装饰者模式的缺点
- 复杂性增加
- 多层装饰可能导致调用链过长,增加调试和理解难度
- 案例:
Java I/O
流中,多层装饰(如缓冲+字符集转换)可能让调用栈变深
- 装饰顺序敏感
- 不同装饰顺序可能导致不同结果
- 案例:电商订单系统中,先加急再包装 vs 先包装再加急,价格计算可能不同
- 小对象增多
- 每个装饰器都是一个独立对象,可能增加内存开销
- 案例:Netty 中,每个 ChannelHandler 都是一个独立装饰器
- 接口膨胀
- 组件接口需要定义所有装饰器可能用到的方法
- 案例:Java I/O 中,
InputStream
需要定义所有可能的流操作方法
- 不适合静态配置
- 如果功能组合是固定的,装饰者模式可能不如直接继承简洁
- 案例:某些业务场景中,功能组合是固定的,直接继承更合适
装饰者模式的适用场景
- 动态功能扩展
- 需要运行时动态添加或撤销功能
- 案例:Java I/O 流、电商订单附加服务
- 避免子类爆炸
- 功能组合复杂,继承会导致子类数量激增
- 案例:游戏装备系统(武器+宝石+附魔)
- 透明增强
- 需要在不改变客户端代码的情况下增强功能
- 案例:Spring 的
TransactionAwareCacheDecorator
- 分层处理
- 需要将功能拆分为多个独立模块,按需组合
- 案例:Netty 的
ChannelPipeline
、Web 中间件(权限校验→日志记录→缓存处理)
- 兼容性处理
- 需要在不修改原有代码的情况下适配新功能
- 案例:Java Collections 的
checkedList
实现类型安全
相关文章:
【设计模式】【结构型模式】装饰者模式(Decorator)
👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD 🔥 2025本人正在沉淀中… 博客更新速度 👍 欢迎点赞、收藏、关注,跟上我的更新节奏 🎵 当你的天空突…...
3D可视化定制:开启个性化消费新时代
3D可视化定制是一种将产品的三维模型与可视化技术相结合,以满足消费者个性化需求的服务。以下是对3D可视化定制的详细介绍: 一、定义与原理 3D可视化定制是指利用三维建模技术和可视化工具,为消费者提供一个直观、互动且高度个性化的定制平…...
CRMEB 多商户版v3.0.1源码全开源+PC端+Uniapp前端+搭建教程
一.介绍 crmeb多商户是一套B2B2C商家入驻模式的平台多商户商城系统,系统支持平台自营、联营、招商等多种运营模式,可满足企业新零售、批发、分销、预售、O2O、多店、商铺入驻等各种业务需求。 后端全开源、uniapp多端可编译! 二、搭建教程…...
java八股文-mysql
1. 索引 1.1 什么是索引 索引(index)是帮助Mysql高效获取数据的数据结构(有序).提高数据的检索效率,降低数据库的IO成本(不需要全表扫描).通过索引列对数据进行排序,降低数据排序成本,降低了CPU的消耗. 1.2 mysql索引使用的B树? 1. 没有使用二叉树,最坏情况o&…...
Audio-Visual Speech Enhancement(视听语音增强)领域近三年研究进展与国内团队及手机厂商动态分析
一、视听语音增强领域近三年研究进展 多模态融合与模型轻量化 多模态特征融合:中国科学技术大学团队提出通过引入超声舌头图像和唇部视频的联合建模,结合知识蒸馏技术,在训练阶段利用教师模型传递舌部运动知识,从而在推断时仅依赖唇部视频即可提升语音增强效果。此外,中科…...
React AJAX:深入理解与高效实践
React AJAX:深入理解与高效实践 引言 随着互联网技术的不断发展,前端开发领域也经历了翻天覆地的变化。React 作为当前最流行的前端框架之一,其强大的组件化和虚拟DOM机制受到了广泛关注。而 AJAX(Asynchronous JavaScript and XML)作为实现前后端数据交互的重要技术,与…...
撕碎QT面具(1):Tab Widget转到某个Tab页
笔者未系统学过C语法,仅有Java基础,具体写法仿照于大模型以及其它博客。自我感觉,如果会一门对象语言,没必要先刻意学C,因为自己具有对象语言的基础,等需要用什么再学也不迟。毕竟不是专门学C去搞算法。 1…...
2025.2.16
Web [GDOUCTF 2023]泄露的伪装: 点进去看就是装神弄鬼,那就直接扫描 果然有东西 第一个是php代码 第二个是个文件 访问发现是一样的 分析一下:使用 file_get_contents($cxk) 函数读取 $cxk 变量中指定的 URL 或文件的内容。 如果读取的内…...
002 第一个python程序
编程语言 编程语言可以做的事情: 网站开发、软件 、游戏、APP、 小程序、 爬虫、 数据分析、脚本 第一个python程序 找到IDE图标pycharm 新建项目 选择项目路径 创建目录 新建python文件 输入代码 运行程序查看结果 print 介绍 print : 输出内容…...
面试完整回答:SQL 分页查询中 limit 500000,10和 limit 10 速度一样快吗?
首先:在 SQL 分页查询中,LIMIT 500000, 10 和 LIMIT 10 的速度不会一样快,以下是原因和优化建议: 性能差异的原因 LIMIT 10: 只需要扫描前 10 条记录,然后返回结果。 性能非常高,因为数据库只…...
《Foundation 起步》
《Foundation 起步》 引言 在当今快速发展的科技时代,了解并掌握最新的技术是至关重要的。本文旨在为初学者提供一个全面的《Foundation》起步指南,帮助大家快速入门并掌握这一强大的技术。 一、什么是Foundation? Foundation 是一个流行的前端框架,由 ZURB 公司开发。…...
【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十五节】
ISO 14229-1:2023 UDS诊断服务测试用例全解析(RoutineControl_0x31服务) 作者:车端域控测试工程师 更新日期:2025年02月14日 关键词:UDS协议、0x31服务、例程控制、ISO 14229-1:2023、ECU测试 一、服务功能概述 0x31服…...
数据结构:顺序表
目录 一、数据结构的概念 什么是数据结构? 为什么还需要数据结构? 二、顺序表 1.线性表 2.顺序表和数组的区别 3.顺序表分类 3.1静态顺序表 3.2动态顺序表 三、动态顺序表的实现 一、数据结构的概念 什么是数据结构? 数据结构可以…...
LC-随机链表的复制、排序链表、合并K个升序链表、LRU缓存
随机链表的复制 为了在 O(n) 时间复杂度内解决这个问题,并且使用 O(1) 的额外空间,可以利用以下技巧: 将新节点插入到原节点后面:我们可以将复制节点插入到原节点后面。例如,如果链表是 A -> B -> C,…...
对于简单的HTML、CSS、JavaScript前端,我们可以通过几种方式连接后端
1. 使用Fetch API发送HTTP请求(最简单的方式): //home.html // 示例:提交表单数据到后端 const submitForm async (formData) > {try {const response await fetch(http://your-backend-url/api/submit, {method: POST,head…...
打印问题总结
问题一: 记一次发票打印模糊问题,后端返回的是pdf 之前实现的效果是将后端返回的pdf转成canvas再转成图片 预览 问题: 打印效果很模糊 解决方式: 就是直接预览pdf 借助pdf的打印和下载即可 问题二: 激光打印一般…...
2025蓝桥杯JAVA编程题练习Day4
1.艺术与篮球 问题描述 小蓝出生在一个艺术与运动并重的家庭中。 妈妈是位书法家,她希望小蓝能通过练习书法,继承她的艺术天赋,并练就一手好字。爸爸是一名篮球教练,他希望小蓝能通过篮球锻炼身体,培养运动的激情和…...
github用户名密码登陆失效了
问题: git push突然推代码需要登陆,但是用户名和密码正确输入后,却提示403 git push# Username for https://github.com: **** #Password for https://gyp-programmergithub.com: #remote: Permission to gyp-programmer/my-app.git denie…...
数据结构 day02
3. 线性表 3.1. 顺序表 3.1.3. 顺序表编程实现 操作:增删改查 .h 文件 #ifndef __SEQLIST_H__ #define __SEQLIST_H__ #define N 10 typedef struct seqlist {int data[N];int last; //代表数组中最后一个有效元素的下标 } seqlist_t;//1.创建一个空的顺序表 seq…...
前端里的this指向问题
目录 1.代码输出结果 2.代码输出结果 3.代码输出结果 4.代码输出结果 5.代码输出结果 6.代码输出结果 7.代码输出结果 8.代码输出结果 9.代码输出结果 10.代码输出结果 11.代码输出结果 12.代码输出结果 13.代码输出结果 14.代码输出结果 总结 1.代码输出结果 f…...
pandas(11 分类数据和数据可视化)
前面内容:pandas(10 日期和Timedelta) 目录 一、Python Pandas 分类数据 1.1 pd.Categorical() 1.2 describe() 1.3 获取类别的属性 1.4 分类操作 1.5 分类数据的比较 二、Python Pandas 数据可视化 2.1 基础绘图:plot 2.2 条形图 2.3 直方…...
cmake Qt Mingw windows构建
今天教大家怎么在windows构建qt应用使用cmd命令行,而不是一键通过QtCreator一键构建。首先我们用qtcreator创建一个模板程序(PS:记得在安装qt时要悬着mingw套件,如果安装太慢可以换源) 输入以下的命令: mkdir build …...
缓存穿透、缓存击穿、缓存雪崩的区别与解决方案
1. 缓存穿透(Cache Penetration) 定义:大量请求查询 数据库中不存在的数据,导致请求绕过缓存直接访问数据库,造成数据库压力过大。 场景: 恶意攻击:例如用不存在的用户ID频繁请求。 业务误操作…...
【Rust中级教程】1.6. 内存 Pt.4:静态(static)内存与‘static生命周期标注
喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 1.6.1. 静态(static)内存 static内存实际上是一个统称,它指的是程序编译后的文…...
Python爬虫实战:股票分时数据抓取与存储 (1)
在金融数据分析中,股票分时数据是投资者和分析师的重要资源。它能够帮助我们了解股票在交易日内的价格波动情况,从而为交易决策提供依据。然而,获取这些数据往往需要借助专业的金融数据平台,其成本较高。幸运的是,通过…...
HTML之JavaScript对象
HTML之JavaScript对象 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><s…...
【第12章:深度学习与伦理、隐私—12.3 深度学习模型的透明性与可解释性提升策略】
凌晨三点的ICU病房,AI辅助诊断系统将一位患者的肺炎误判为普通感冒——当主治医生要求查看诊断依据时,系统只能给出冷冰冰的概率数值。这场惊心动魄的误诊事件,掀开了深度学习可解释性危机的冰山一角。 一、模型透明的"第一性原理" 1.1 可解释性的三维度量 ![可…...
SOCKET建立简单的tcp服务端与客户端通信
socket是什么 socket可以使两台机子建立连接,就像连接风扇与电源的插座一样,socket可以使服务端与客户端建立连接,服务端就像供电厂,而客户端就像用电器,而socket就是连接二者的插座。 建立简单的连接 如果我们想在客…...
最新智能优化算法: 阿尔法进化(Alpha Evolution,AE)算法求解23个经典函数测试集,MATLAB代码
一、阿尔法进化算法 阿尔法进化(Alpha Evolution,AE)算法是2024年提出的一种新型进化算法,其核心在于通过自适应基向量和随机步长的设计来更新解,从而提高算法的性能。以下是AE算法的主要步骤和特点: 主…...
HTML之JavaScript常见事件
HTML之JavaScript常见事件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title>&…...
《云原生安全攻防》-- K8s镜像安全:镜像全生命周期安全管理
从攻击者的角度来看,针对容器镜像的软件供应链攻击和镜像投毒等攻击方式,不仅攻击成本低,而且还能带来更高且持久的收益。因此,镜像安全问题变得日益突出。 在本节课程中,我们将深入探讨镜像全生命周期的安全管理&…...
【Copilot】Redis SCAN SSCAN
目录 SCAN 命令SSCAN 命令使用示例原理Redis SCAN 和 SSCAN 命令的注意事项及风险注意事项风险 以下内容均由Github Copilot生成。 SCAN 和 SSCAN 命令是 Redis 提供的用于增量迭代遍历键或集合元素的命令。它们的主要优点是可以避免一次性返回大量数据,从而减少对 …...
【含开题报告+文档+PPT+源码】基于Spring+Vue的拾光印记婚纱影楼管理系统
开题报告 本论文旨在探讨基于Spring和Vue框架的拾光印记婚纱影楼管理系统的设计与实现。该系统集成了用户注册登录、个人资料修改、婚庆资讯浏览、婚庆套餐查看、婚纱拍摄预约、婚纱浏览与租赁、客片查看以及在线客服等多项功能,为用户提供了一站式的婚纱影楼服务体…...
静态页面在安卓端可以正常显示,但是在ios打开这个页面就需要刷新才能显示全图片
这个问题可能有几个原因导致,我来分析一下并给出解决方案: 首要问题是懒加载实现方式的兼容性问题。当前的懒加载实现可能在 iOS 上不够稳定。建议修改图片懒加载的实现方式: // 使用 Intersection Observer API 实现懒加载 function initLazyLoading() {const imageObserver…...
【Qt】QObject类的主要功能
在 Qt 中,QObject 类是所有 Qt 对象的基类,提供了许多基础功能,使得 Qt 的对象系统能够有效地工作。它为其他类提供了核心的机制,比如信号和槽机制、对象树结构、内存管理等。 QObject 类的主要功能: 信号和槽机制&am…...
第 16 天:游戏 UI(UMG)开发,打造主菜单 血条!
🎯 目标 ✅ 使用 UMG 创建 UI 并在游戏中显示 ✅ 实现血条(HP Bar)系统,动态显示角色生命值 ✅ 创建主菜单 UI,并添加开始/退出按钮 ✅ 保存当前场景,创建新场景作为主菜单 ✅ 点击 StartGameButton 后&am…...
兔兔答题应用于微信考试、付费考试、社会调查问卷、明星知识问答、员工培训考核、模拟自测、企业面试、试题库等多种场景。
“兔兔答题系统”是一个面向教育、培训和在线测评场景的智能化答题平台(兔兔答题官网地址)。其设计目标是帮助用户高效完成题目练习、考试组织及学习效果分析,通常具备以下核心功能和特色: 一、核心功能 题库管理 支持多题型录入&…...
【办公类-90-02】】20250215大班周计划四类活动的写法(分散运动、户外游戏、个别化综合)(基础列表采用读取WORD表格单元格数据,非采用切片组合)
背景需求: 做了中班的四类活动安排表,我顺便给大班做一套 【办公类-90-01】】20250213中班周计划四类活动的写法(分散运动、户外游戏、个别化(美工室图书吧探索室))-CSDN博客文章浏览阅读874次࿰…...
19.4.6 读写数据库中的二进制数据
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 需要北风数据库的请留言自己的信箱。 北风数据库中,类别表的图片字段在【数据表视图】中显示为Bitmap Image࿱…...
使用 Python 爬虫获取微店快递费用 item_fee API 接口数据
在电商运营中,快递费用是影响商家利润和用户体验的重要因素之一。微店作为国内知名的电商平台,提供了丰富的 API 接口供开发者使用,其中也包括查询商品快递费用的接口。通过调用微店的 item_fee 接口,开发者可以获取指定商品的快递…...
蓝桥杯篇---温度传感器 DS18B20
文章目录 前言DS18B201. DS18B20 引脚说明2. 单总线通信协议3. DS18B20 操作流程初始化写操作读操作 4. 示例代码5. 代码说明6. 注意事项总结 前言 本文简单介绍了IAP15F2K61S2中温度传感器模块DS18B20的使用。 DS18B20 DS18B20 是一款数字温度传感器,采用单总线&…...
NAC网络接入控制三种认证方式802.1X认证、MAC认证和Portal认证
NAC网络接入控制三种认证方式802.1X认证、MAC认证和Portal认证 1.NAC简介2.802.1X认证3. MAC认证4. Portal认证 1.NAC简介 NAC(Network Access Control)称为网络接入控制,通过对接入网络的客户端和用户的认证保证网络的安全,是一…...
字节Trae使用感想(后端)
前言 昨天分享了字节哥的Trae从0到1创作模式构建一个vue前端项目,今天又来试试她的后端项目能力。不是我舔,不得不说确实不错。可惜现在曾经没有好好学习,进不了字节。既然进不了字节,那我就用字节哥的产品吧。 后面有惊喜…...
蓝桥杯 Java B 组之简单动态规划(爬楼梯、斐波那契数列)
Day 6:简单动态规划(爬楼梯、斐波那契数列) 动态规划(Dynamic Programming,简称 DP)是计算机科学中的一种算法设计思想,用来解决最优解问题,它的核心思想是将大问题分解为小问题&am…...
传统 I/O 和 NIO 的主要区别
在 Java 中,文件读写可以通过传统的 I/O 方式(如 InputStream 和 OutputStream)或 NIO(New I/O)方式(如 FileChannel)来实现。NIO 的 FileChannel 提供了更高效的文件操作方式,尤其是…...
0基础学LabVIEW
对于零基础的朋友来说,学习LabVIEW需要一个科学的学习路径和方法。通过观看优质的B站教程打好基础,再结合实际项目进行实践操作,能够快速提升LabVIEW的应用能力。以下是从入门到进阶的学习建议。 一、利用B站入门教程打基础 筛选优质教程…...
二〇二四年终总结
写在前面 简单总结一下告诉自己,曾经活着 不必太纠结于当下,也不必太忧虑未来,当你经历过一些事情的时候,眼前的风景已经和从前不一样了。——村上春树 原本应该 24 年年中的时候写 23 年年终的总结,但是一直拖着&…...
设计模式:状态模式
状态机有3个要素:状态,事件,动作。 假如一个对象有3个状态:S1、S2、S3。影响状态的事件有3个:E1、E2、E3。每个状态下收到对应事件的时候,对象的动作为AXY。那么该对象的状态机就可以用如下表格来表示。S1收到事件E1的…...
SQLite Select 语句详解
SQLite Select 语句详解 SQLite 是一个轻量级的数据库管理系统,以其简洁的设计和高效的性能被广泛应用于各种场景。在 SQLite 中,SELECT 语句是用于查询数据库中的数据的命令。本文将详细介绍 SQLite 的 SELECT 语句,包括其基本语法、常用功…...
【深度学习】计算机视觉(CV)-目标检测-Faster R-CNN —— 高精度目标检测算法
1.什么是 Faster R-CNN? Faster R-CNN(Region-based Convolutional Neural Network) 是 目标检测(Object Detection) 领域的一种 双阶段(Two-Stage) 深度学习方法,由 Ross Girshick…...