- 博客(59)
- 收藏
- 关注
原创 设计模式之观察者模式
观察者模式(Observer Pattern),又称监听器模式(Listener Pattern) 或 发布-订阅模式(Publish-Subscribe Pattern),属于行为型设计模式。该模式定义了一种一对多的依赖关系,当一个对象状态发生改变或执行某个逻辑时,所有依赖于该动作的对象都会收到通知并作出相应的动作该模式的目的就是为了使系统中的主线业务与各个与主线业务相关的支线业务之间实现解耦定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
2026-01-19 15:03:30
518
原创 设计模式之访问者模式
最复杂的设计模式,并且使用频率不高,《设计模式》的作者评价为:大多情况下,你不需要使用访问者模式,但是一旦需要使用它时,那就真的需要使用了我们要根据具体情况来评估是否适合使用访问者模式,例如,我们的对象结构是否足够稳定,是否需要经常定义新的操作,使用访问者模式是否能优化我们的代码,而不是使我们的代码变得更复杂。
2026-01-15 11:18:57
894
原创 设计模式之迭代器模式
迭代器模式(,属于行为型设计模式,在java和python中十分常见。目的是在不暴露集合内部结构的条件下,顺序访问该集合内部的元素。提供一种顺序访问一个集合中所有元素的方式, 而又无需暴露该对象的内部表示。在需要顺序访问集合元素的场景中,传统方式是通过以下方式对集合元素进行遍历i++) {在该方式中,对元素的获取是通过直接调用集合的get()方法完成的,即对元素的遍历由集合本身负责而使用迭代器设计模式后,集合本身不负责元素的遍历,而提供一个获取迭代器的方法iterator()
2026-01-15 11:07:10
588
原创 设计模式之模板方法模式
官方解释:定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。设计模式大咖闫宏解释:模板方法模式是类的行为型模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。个人理解。
2026-01-14 15:37:20
950
原创 设计模式之策略模式
所谓策略模式,指的是做某一件事时有多种选择(即策略),且不同的策略之间相互独立,而且无论使用哪种策略,得到的结果都是相同的Context封装角色这个角色是策略模式中的重要组成部分,通常用于存储和传递策略对象,以及处理策略对象的交互逻辑。上下文对象在客户端的请求下,会调用合适的策略对象来执行相应的操作。Strategy抽象策略角色这个角色通常是一个接口,用于定义各种策略对象的共同方法。具体策略对象实现这个接口,并包含具体的算法实现。策略对象不持有任何上下文对象的状态,这样保证了策略对象的可复用性。
2026-01-14 11:01:12
967
原创 设计模式之命令模式
命令模式(Command Pattern),属于行为型设计模式。指的是把方法调用封装成命令,然后执行该命令。目的是为了将类中的各个方法抽出来,形成独立的类,且该类只有一个方法execute(),调用该类的execute()方法就等同于调用原类中对应的方法。更接地气的说法是,
2026-01-13 17:35:30
375
原创 设计模式之责任链模式
责任链模式是一种行为型设计模式,核心思想是:将请求的处理者连成一条链,请求沿着链传递,直到某一个处理者决定处理该请求;每个处理者都可以选择处理请求,或把请求传递给链中的下一个处理者。它的核心价值是:解耦请求的发送者和接收者,请求发送者无需知道谁最终处理请求,处理者也无需知道请求的完整传递路径,新增 / 移除处理者只需调整链的结构,无需修改核心逻辑。责任链模式的核心是 “请求沿链传递,处理者自主决策”,它通过解耦请求发送者和接收者,实现了处理逻辑的灵活扩展。
2026-01-13 16:45:27
968
原创 设计模式之组合模式
组合模式(Composite Pattern),属于结构型设计模式。组合模式常用于树形的数据结构,比如:多级菜单、部门层级关系、html文本中的dom树。它的特点是使用户对单个对象和组合对象的使用是相同的,也就是说,使用组合模式可以把一个子节点与其父节点统一处理。当我们对一个节点按照某种逻辑进行处理时,与此同时,会以类似递归的形式对其子节点按照相同的逻辑进行处理。该设计模式主要角色就两种:①抽象接口,②实现类。
2026-01-13 11:23:56
625
原创 设计模式之桥接模式
桥接模式,是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化。桥接模式通过组合的方式建立两个类之间的联系,而不是继承桥接模式是一种重要的结构型设计模式,它通过将抽象部分与实现部分分离,实现了它们之间的解耦,并支持独立的变化。在实际开发中,桥接模式特别适用于有多个变化维度、需要支持多平台、或者需要解耦抽象和实现的场景。通过合理使用桥接模式,可以大大提高系统的灵活性和可维护性。
2026-01-07 17:12:55
711
原创 设计模式之装饰器模式
装饰器模式(Decoration Pattern),属于结构型设计模式,用于在不改变现有对象的基础上,对该对象的方法动态地添加新的功能,实现对该对象原有方法的增强装饰器模式的设计思想是将对象的核心功能和附加功能独立开来。核心功能由现有对象提供,附加功能由装饰器提供。装饰器的实现思路是存在一个抽象的装饰器类,该装饰器类用于对现有的对象进行包装,然后通过该装饰器的具体子类对包装的类的方法进行增强。推而论之,在存在多个装饰器具体子类的情况下,可以动态地。
2026-01-07 14:04:35
1213
原创 设计模式之享元模式
享元模式(FlyWeight),属于结构型设计模式,主要解决实例化大量相同的对象,从而导致可能的内存泄漏的问题。为了解决这个问题,享元模式提出的解决办法是将相同的对象保存在内存中,且仅保存一个对象,因此该对象应该是不可被修改的,当需要获取该对象实例时,直接从内存中读取即可,从而避免了相同对象的重复创建。下面是享元模式的定义:运用共享技术有效地支持大量细粒度的对象总之,享元模式适用于那些需要大量使用相同或相似对象,并且需要频繁创建和销毁同一类对象的场景。
2026-01-07 13:39:05
965
原创 设计模式之代理模式
代理模式(Proxy Pattern),属于结构型设计模式。主要目的是为了解决给对象方法进行增强,又不修改原对象方法。通过代理类对被代理对象进行代理,可以在被代理对象执行方法前后添加附加功能,丝毫不需要修改原方法中的逻辑。仅从字面意思我们也可以猜到,在代理模式中,从直接访问对象的方式转变为我们通过代理间接访问对象。这就需要我们引入一个代理类,我们只需要访问代理类即可,由代理类访问目标对象。
2026-01-07 10:51:19
681
原创 设计模式之外观模式
外观模式(Facade Pattern),又称为门面模式,属于结构型设计模式。外观模式为一组子系统的逻辑调用提供一个独立的接口调用。在不使用外观模式的情况下,实现一个功能时需要按照一定的顺序对多个方法调用,因此我们需要关注对哪些方法进行调用,以及按照什么样的顺序。而在外观模式中,我们通过调用外观类(Facade)的一个方法就可以实现该功能,该外观类(Facade)内部按照对应的顺序对这些方法进行调用,而具体按照什么样的顺序调用哪些方法我们无需关注,交给外观类(Facade)就可以了。
2026-01-06 16:42:03
273
原创 设计模式之适配器模式
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能以上三种形式是根据src是以怎样的形式给到Adapter类适配器:以类给到,在Adapter里,就是将src当做类,继承对象适配器:以对象给到,在Adapter里,将src作为一个对象,持有接口适配器:以接口给到,在Adapter里,将src作为一个接口,实现Adapter。
2026-01-06 16:41:45
1668
原创 设计模式之原型模式
原型模式属于创建型设计模式,用于创建重复的对象,且同时又保证了性能。该设计模式的好处是将对象的创建与调用方分离。其目的就是**根据一个对象(称为原型)创建一个与其完全相同的对象(当然内存地址不同)**原对象被认为是新对象的原型。原型模式用于创建具有相同属性的重复对象。原型模式的实现就是实现Cloneable接口 + 重写clone()方法实现的。Object类的clone()方法实现由JVM实现,性能较好。但仅能实现浅拷贝。
2026-01-06 09:59:07
313
原创 设计模式之单例模式
单例模式,属于创建型设计模式,单指一个,例指实例,就是说在一个程序的运行过程中,应用了单例模式的类始终只有一个实例,且不允许出现多个实例,并在整个程序中提供一个获取该实例的方法。应用spring中的bean默认就是单例模式,类的实例化由spring完成,我们只需要从框架中获取即可,而不是直接去new一个实例。web应用中的Servlet。我们在应用开发时,线程池也应当设计成单例模式。**何时使用:**如果一个类的实例在整个生命周期中是无状态的,则可以使用单例模式使整个应用程序中只有一个实例。
2026-01-05 17:23:36
958
原创 设计模式之抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)属于创建型设计模式。用于解决比工厂方法设计模式更加复杂的问题。复杂到哪里了呢?我们将抽象工厂模式和工厂模式进行简单的比较,或许可以有更好的理解:工厂方法设计模式中,指定工厂只能创建对应的单个产品,是一对一的关系。抽象工厂模式中,不仅需要创建产品的工厂,还多了一个创建工厂的工厂(顶级工厂)。当顶级工厂创建一个工厂时,顶级工厂与工厂是一对一的关系(等同于工厂模式),被创建的工厂可以生产多个产品,因此顶级工厂与产品之间是一对多的关系。
2026-01-05 11:44:40
228
原创 设计模式之工厂模式
工厂模式(Factory Pattern)是最常使用的设计模式之一,属于创建型设计模式。在该设计模式中,我们不再使用new来实例化对象,而是通过工厂对象来获取指定的对象实例,其中对象的实例化过程是在工厂中完成的。换句话说,就是将对象的实例化过程从调用方控制改变成工厂控制。
2026-01-05 11:06:48
801
原创 Java中的七大设计原则
Java 中的七大设计原则,也称为 SOLID 原则,是一组指导面向对象设计的基本规则。这些原则帮助开发者构建具有高内聚、低耦合的系统,从而提高代码的重用性、可读性、可扩展性和可靠性。
2026-01-04 17:15:33
967
原创 Vmware虚拟机三种网络模式详解
打开vmware虚拟机,我们可以在选项栏的“编辑”下的“虚拟网络编辑器”中看到VMnet0(桥接模式)、VMnet1(仅主机模式)、VMnet8(NAT模式),那么这些都是有什么作用呢?其实,我们现在看到的VMnet0表示的是用于桥接模式下的虚拟交换机;VMnet1表示的是用于仅主机模式下的虚拟交换机;VMnet8表示的是用于NAT模式下的虚拟交换机。
2025-12-31 14:21:53
910
原创 Spring Bean生命周期详解
API的方式Xml文件方式properties文件的方式注解的方式spring中提供了一个类PropertiesBeanDefinitionReader,将xml中定义的bean解析为BeanDefinition对象,过程和xml的方式类似。下面通过properties文件的方式实现上面xml方式定义的bean。来个properties文件:beans.propertiescar.name=??car1.name=???user.name=???Java。
2025-12-27 17:18:12
688
原创 【Mysql】DruidDataSource 深入理解数据库编程中的超时设置
数据库是开发过程中最常用的组件,然而我们经常会遇到各种各样的超时异常,如:connect timeout:建立数据库连接超时socket timeout:socket 读取超时statement timeout:单个sql执行超时transaction timeout:事务执行超时,一个事务中可能包含多个sqlget connection timeout:从连接池中获取链接超时读完此文,你将彻底掌握各种超时产生的根本原因,以及对应的解决方案。
2025-11-28 14:31:07
892
原创 Mysql 常用窗口函数
基于 OVER 子句中的 ORDER BY 表达式确定一组行中当前行的序号(从 1 开始计数)。如果存在可选的 PARTITION BY 子句,则为每组行重置序号。ORDER BY 表达式中具有相同值的行以非确定性的方式接收不同的行号。其他用法和min() count() 一样。
2025-11-28 13:32:48
234
原创 JVisualVM 工具使用
jvisualvm是JDK自带的具有图形界面操作功能的JVM性能监控和诊断工具,它不仅能分析和诊断堆转储文件,在线实时监控本地JVM进程,还能监控远程服务器上的JVM进程。
2025-05-17 15:10:33
1324
原创 如何设置线程池大小
线程池是Java中用于优化线程管理和资源利用的重要机制。它通过复用线程、限制最大线程数量,减少线程创建和销毁的开销,从而提升系统性能。Java的线程池框架Executor提供了ThreadPoolExecutor和ScheduledThreadPoolExecutor两个核心实现,分别用于执行任务和定时任务。线程池的核心参数包括核心线程数、最大线程数、任务队列和拒绝策略等,开发者可以根据业务需求自定义线程池。线程数量的设置需根据任务类型(CPU密集型或I/O密集型)进行调整,通常采用N+1或2N的公式计算,
2025-05-16 15:23:10
840
原创 NGINX upstream、stream、四/七层负载均衡以及案例示例
伴随单台服务器性能及单点故障问题的凸显,一方面需要增加系统的硬件处理能力,另一方面需要添加机器构建应用集群。应用集群:将同一应用部署到多台机器上,组成处理集群,接收负载均衡设备分发的请求,进行处理并返回响应的数据负载均衡器:将用户访问的请求根据对应的负载均衡算法,分发到集群中的一台服务器进行处理。
2025-04-27 11:08:21
1497
原创 常见的http认证方式
Digest Auth(摘要认证)是另一种 HTTP 认证协议,它兼容了 Basic 认证方式,也修复了 Basic 的严重缺陷,提供了更安全的方式进行验证摘要认证采用质询/响应的方式。整体过程简单来说就是,一开始客户端先向服务端请求认证要求,接着使用服务端响应回的质询码计算生成响应码。最后携带响应码再次请求服务端进行认证摘要认证步骤:整体步骤分为三步:1、客户端请求服务端,服务端不知道客户端是否真的知道密码,请求失败,返回,并返回字段,该字段中包含认证所需要的信息。
2025-04-27 09:07:34
2620
原创 LINUX 压缩和解压
(2)归档:通常是将多个文件和目录收集到一个单一的文件中,方便存储、备份或传输。归档文件并不一定减小文件的总体大小,主要是为了整理和组织文件。
2025-04-25 16:16:35
978
原创 一文搞懂 UML 类图
主要就是使用UML的类图,类图用于描述系统中所包含的类以及它们之间的相互关系,帮助人们简化对系统的理解,它是和的重要产物,也是的重要模型依据一、简介统一建模语言 UML (Unified Modeling Language) 类图是一种用于描述系统结构的图形化工具。它以类和对象为基础,主要用于表示系统中的类、接口、继承关系、关联关系等元素,以及它们之间的静态结构和关系。在本文中,将深入介绍UML类图的基本元素、关系类型以及如何创建一个简单而有效的类图。
2024-11-12 16:43:56
1323
原创 代码优雅的规范
通过这篇文章你将了解到整洁的代码对项目、公司和你的重要性,以及如何书写整洁的代码通过命名、类、函数、测试这四个章节,使我们的代码变得整洁。
2024-11-01 17:36:41
1901
2
原创 问题记录:u盘容量恢复
场景:自己16G的u盘用装机助理制作装win10系统w的启动U盘,制作途中u盘容量变成2G,网上说主要是因为自己的u盘不是正版,是被扩容后的。等待出现100 百分比已完成 U盘容量就恢复了。1.win+R 后 输入cmd。2 ,然后依次输入以下命令。现在教你把u盘容量恢复。
2024-09-06 13:10:10
1672
原创 MybatisPlus指定字段查询
统计 device 表中的 device_id 的数量 devicetId。解释: 查询 device 表中的 project_id 给别名 projectId。
2024-06-24 09:23:50
1394
原创 RabbitMQ 保证消息不丢失的几种手段
我们通过分析消息从生产者发送消息到消费者消费消息的全过程,得出了消息可能丢失的几种场景,并给出了相应的解决方案,如果需要保证消息在整条链路中不丢失,那就需要生产端、mq自身与消费端共同去保障。生产端:对生产的消息进行状态标记,开启confirm机制,依据mq的响应来更新消息状态,使用定时任务重新投递超时的消息,多次投递失败进行报警。mq自身:开启持久化,并在落盘后再进行ack。如果是镜像部署模式,需要在同步到多个副本之后再进行ack。
2024-04-29 11:39:42
7095
原创 RabbitMQ重复消费问题
通常需要考虑消息的唯一标识、消息存储、消息状态管理等方面的问题来有效地解决重复消费问题RabbitMQ重复消费_rabbitmq怎么解决重复消费-CSDN博客。
2024-04-29 10:49:37
1210
原创 获得文件MD5——校验完整性 & window 和 Linux下操作
md5值常用于大型文件的完整性检查,即给予方给出文件的同时给出md5值,接收方收到文件后再次计算md5值,如果两个md5值相同,说明文件在传输过程中没有损坏。通用的语法为“certutil -hashfile <文件名> <hash类型>”,其中,<hash类型>可填 MD5、SHA1、SHA256等。linux中每个文件都会有1个md5值。当两个文件的md5值相同,表示这两个文件完全相同。window和Linux下同一文件计算的MD5是一致的。二、Linux下获得文件MD5。
2024-04-22 13:57:58
724
原创 SpringBoot的@ConditionalOnMissingBean注解的作用
示例代码中people是定义在配置类中的,当执行到配置类解析的时候,@Component,@Service,@Controller ,@Configuration标注的类已经全部被解析,所以这些BeanDifinition已经被同步。但是bean1的条件注解依赖的是city,city是被定义的配置类中的,因为两个Bean都是配置类中Bean,所以此时配置类的解析无法保证先后顺序,就会出现不生效的情况。同样的道理,如果依赖的是FeignClient,也有可能会出现不生效的情况。来确定你要哪个实现;
2024-04-22 10:53:13
2969
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅