自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 资源 (1)
  • 收藏
  • 关注

原创 设计模式-责任链模式

责任链模式适用于请求有多种处理方式,各处理者之间有顺序,而且可以动态更改顺序的场景,可以使请求的发送者与处理者解耦,灵活、可扩展。Java实现时,只需要让处理者持有下一个处理者,通过递归传递请求,使责任链得以贯通。Spring 框架中责任链模式的应用本质表现为一组处理器按照预先组织的顺序依次处理请求或对象(如 HTTP 请求、Bean、异常、方法执行等),具备责任链的解耦、灵活顺序等优点。MVC 拦截器链安全过滤器链Bean(处理器)后置链AOP Advice 链异常处理链。

2025-07-10 15:59:14 822

原创 设计模式-策略模式-复杂场景扩展

/ 满足金额// 减去金额@Override组合策略允许将多个策略组合在一起,按照特定规则进行计算。叠加型:所有折扣同时生效(如满减 + VIP 折扣)优先级型:只选择最优的折扣(如取最大值)顺序型:按顺序依次执行(如先满减,再打折)技术作用示例扩展策略类支持更复杂的折扣逻辑(如满减)组合策略实现多个折扣规则叠加策略工厂简化策略的创建与管理通过扩展策略类和组合策略,我们可以灵活应对各种复杂的折扣规则,如满减、叠加、优先级选择等。

2025-07-04 11:46:52 257

原创 设计模式-策略模式

策略模式在商品折扣中的应用

2025-07-04 11:38:23 342

原创 设计应用-20250616

本方法通过条件判断实现了数字向不同集合的分层添加逻辑,结构清晰、易于维护,并且避免了重复添加的问题。适用于需要根据数值范围动态分类存储的场景,例如数据分析、评分归类等。但是以上方法并不优雅,我们需要将以上逻辑改造的更优雅一些。为了解决这个问题,我们可以使用函数式编程和策略模式的思想,将条件判断和操作解耦,使代码更简洁、清晰、易于扩展。以下是优化后的实现方案。优势说明可读性更强条件和操作分离,逻辑更清晰可维护性更高新增条件只需修改规则列表,无需改动核心逻辑可扩展性更好。

2025-06-16 11:23:27 852

原创 设计模式-代理模式

应用场景作用特点远程代理隐藏远程通信细节适用于网络服务、分布式系统虚拟代理延迟加载资源提高性能,节省资源保护代理控制访问权限适用于权限验证、安全控制缓存代理缓存结果,避免重复操作提高响应速度,减少资源消耗日志/监控代理添加日志、性能监控等功能便于调试、运维分析同步代理控制多线程访问保障线程安全通过代理模式,可以在不修改原有业务逻辑的情况下,灵活地增强系统功能、优化性能、提升安全性,是构建可维护、可扩展系统的有力工具。

2025-06-12 13:39:04 5

原创 设计模式-享元模式

享元模式(Flyweight Pattern)是一种结构型设计模式,用于高效共享大量细粒度对象,从而减少内存消耗。它通过分离对象的状态为内部状态(Intrinsic)和外部状态(Extrinsic),使得多个对象可以共享相同的内部状态,而外部状态则在使用时动态传入。// 棋子接口项目描述内部状态color 字段:所有相同颜色的棋子共享该实例。外部状态Position 对象:每次调用 display() 时动态传入。工厂作用控制对象创建,确保相同颜色的棋子只创建一次。优点。

2025-06-05 14:12:38 199

原创 滑动窗口系列

滑动窗口算法通过双指针动态调整窗口的大小,能够在 O(n)O(n) 时间复杂度下解决许多连续子数组问题。扩展窗口:右指针不断右移。收缩窗口:左指针右移以维持窗口满足条件。记录最优解:在每次满足条件时更新结果。该算法适用于数组元素非负或窗口属性可单调变化的问题,是解决连续子数组问题的重要工具。

2025-06-04 14:34:53 216

原创 工具Map的使用

2. **原子操作:** `computeIfAbsent` 的整个操作是原子性的,这意味着在多线程环境下,即使多个线程同时调用 `computeIfAbsent` 针对同一个键,也只有一个线程会执行 `mappingFunction`,其他线程会阻塞等待,直到计算完成并将结果放入 Map 中。1. **条件式计算:** `computeIfAbsent` 仅在键不存在时才计算值,避免了不必要的计算,提高了效率,尤其是在 `mappingFunction` 的计算成本较高的情况下。

2024-12-25 15:53:44 380

原创 Spring发布事件

在Java Spring框架中,注解用于标识一个方法,该方法可以响应特定的事件。当发布事件时,所有标记了的函数会被调用。

2024-12-25 13:50:19 227

原创 Java-四大引用类型

最常见的引用类型,程序中普遍使用的就是强引用。只要强引用存在,垃圾回收器就永远不会回收被引用的对象,即使内存不足时,JVM宁愿抛出OutOfMemoryError也不会回收强引用对象。用来描述一些还有用但并非必需的对象。在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中进行第二次回收。如果这次回收还没有足够的内存,才会抛出内存溢出异常。用来描述非必需的对象,强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾收集发生之前。

2024-12-25 13:28:49 1000

原创 Java注解

是 Java 中用于自定义校验注解的一部分。它用于指定校验器类,该类负责实际执行校验逻辑。: 这是一个元注解,用于声明一个注解作为校验约束。这意味着你正在创建一个新的注解,它可以用于字段、方法或参数上,以指定特定类型的校验。: 这是注解的一个属性,它接受一个校验器类的数组。这个属性至关重要,因为它将你的自定义校验注解与实际执行校验逻辑的类连接起来。: 这是你编写的校验器类的类名。这个类必须实现接口,并实现isValid()方法。isValid()方法包含了具体的校验逻辑。这里。

2024-12-24 14:13:21 664

原创 动态规划系列-01背包问题

备注:本博客为日常学习记录,方便复习。(麻烦给Up主一键三连,多多支持他)

2024-06-28 09:27:09 310

原创 动态规划系列-Leetcode.1143-最长公共子序列

求解样例:s1:ABCBDAB s2:BDCABC。备注:本博客为日常学习记录,方便复习。(麻烦给Up主一键三连,多多支持他)

2024-06-26 10:23:43 295

原创 动态规划系列-Leetcode.72-编辑距离

求解样例:sunday经过(插/删/替换)操作几次可得saturday?

2024-06-26 10:00:10 392

原创 LeetCode.209. 长度最小的子数组(滑动窗口)

【代码】LeetCode.209. 长度最小的子数组(滑动窗口)

2024-04-30 15:38:57 136 1

原创 LeetCode.134. 加油站(贪心)

2. **为什么选取`(minIndex + 1) % gas.length`作为起点:** 因为如果从某个点开始,油量能持续非负直到结束(即使中间有最低点),那么从这个最低点的下一个点开始,应该也能顺利完成全程(因为此时你已经过了油量最低的点,且最终`sum`是非负的,说明油量足够)。1. **为什么关注`minIndex`:** 如果在某点A的`sum`是最小的,意味着从起点到A的任一点作为起始点都不可能成功绕圈,因为从任何这样的点出发,到达A之前油就会用光。因此,最佳的开始点应该是在A之后。

2024-04-30 15:09:57 376

原创 LeetCode.169. 多数元素(Boyer-Moore投票算法)

这意味着,如果我们每次都能找到两个不同的元素并将它们从序列中移除,直到无法继续为止,剩下的元素(如果有的话)必定是原序列的多数元素。- Boyer-Moore 投票算法只能找到一个候选的多数元素,如果要确认这个候选元素是否真正是多数元素,则需要进行第二次遍历来统计候选元素的数量,确认其是否真的超过了总数的一半。- 如果`count`为0,我们将当前元素设为`candidate`,并将`count`设置为1。由此,当经过成对删除后,若数组中还有剩余元素,则剩余部分的多数元素与原数组的多数元素相同。

2024-04-30 10:09:52 234

原创 Go语言-异常的使用

在 Go 中,错误是一种普通的值,通常由函数返回。当函数执行过程中遇到错误时,它将返回一个非空的错误值,表示发生了某种错误。总结起来,Go 中的异常处理是基于错误处理的模式,开发人员应该根据需要在函数中返回错误值,并使用条件语句来检查和处理错误。当函数遇到错误时,将返回一个非空的错误值。开发人员可以使用条件语句来检查返回的错误值,并处理相应的错误情况。是一种用于处理特殊情况的机制,类似于其他语言中的异常处理机制。在一般情况下,应该使用错误处理的方式来处理错误。语句)和错误检查函数来处理这些错误。

2023-09-07 10:59:38 250 1

原创 Go语言-&和*操作符

在 Go 中,指针和引用的概念很重要,因为它们允许你在函数之间共享和修改变量的值,而不是复制变量的副本。请注意,在使用指针时要小心空指针(nil pointer)的情况,即指针没有指向任何有效的内存地址。在解引用指针之前,应先确保该指针不为 nil。用于解引用指针并获取指针指向的值。指针在 Go 中被广泛使用,用于共享和修改变量的值,并在函数之间传递大型数据结构。用于解引用指针,即获取指针指向的值。它应用于指针类型的变量,用于访问该指针指向的实际值。是两个重要的操作符,用于处理指针和引用。

2023-09-07 10:56:37 3809 1

原创 Python实现selenium操作chrome浏览器(Mac环境)

from selenium import webdriverimport timeimport tracebackdef brower(): # 加载谷歌浏览器驱动 path = "/Users/juanmao/PycharmProjects/chromedriver.exe" driver = webdriver.Chrome(path) # 打开百度搜索网址首页 driver.get('http://www.baidu.com') print(d.

2022-03-28 14:19:47 2304

原创 Python读取Excel和写入Excel

import pandas as pdbidList = []# 读取第一列df = pd.read_excel('read_excel.xlsx', sheet_name='sheet1', usecols=[0])data = df.valuesnum = 0for bookId in data: for bid in bookId: num = num + 1 print("序号:"+str(num)) bidList.appe.

2022-03-28 11:48:10 3645

原创 Python多线程、线程池和多进程、进程池

多线程简单使用案例:from threading import Threadimport timedef crawl(url,page): time.sleep(3) print("\n抓取第"+str(page)+"网页内容。抓取网页链接:"+url)threads = []for page in range(1,11): threads.append(Thread(target=crawl, args=(f"http://www.zuowen.com/suc

2022-03-28 11:23:08 1132

原创 记录使用过的特殊 Python API

使用到Python的API,后期会持续补充

2021-11-29 19:52:18 316

原创 Python3:变量,值类型与引用类型,运算符

目录一、变量命名:二、值类型与引用类型三、运算符注意事项比较运算符:逻辑运算符:成员运算符:关系运算符==和身份运算符is的区别:​对象的三个特征:位运算符:一、变量命名:1、首字母不能是数字2、包含字母、数字、下划线3、系统关键字,不能用在变量名中4、区分大小写原因:type定义为变量,在使用type()函数的时候,会有异常。type(1)理解为1(1)了。两个变量交换:x,y = y,x二、值类型与引用类型int st...

2021-10-02 18:18:47 729 1

原创 Python3:基本数据类型

Python的基本数据类型:1、Number:数字整数:int其他语言:short,int,long浮点数:float其他语言:单精度(float),双精度(double)整数运算结果为整型。浮点数运算结果为浮点类型。整数和浮点类型混合运算,结果为浮点类型。除法除外。对于//除法,这种除法叫做floor除法,会对除法的结果自动进行一个floor操作。Python3 中有六个标准的数据类型:Number(数字) St...

2021-10-02 15:19:48 1026

原创 Python3:进制表示及转换

10进制:2进制:8进制:16进制:

2021-10-01 22:29:29 407

原创 10,2,8,16进制

10进制:0,1,2,3,4,5,6,7,8,9,10 ......2进制:0,1,10 ......8进制:0,1,2,3,4,5,6,7,10 ......16进制:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F10进制转换2进制:2进制转换10进制:小数点前或者整数要从右到左用二进制的每个数去乘以2的相应次方并递增,小数点后则是从左往右乘以二的相应负次方并递减。例如:二进制数1101.01转化成十进制1..

2021-10-01 21:56:51 226

selenium操作Mac环境chrome的安装包

selenium操作Mac环境chrome的安装包

2022-03-28

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除