自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Cheney的博客

记录学习成长过程!

  • 博客(157)
  • 资源 (5)
  • 收藏
  • 关注

原创 设计模式篇章(4)——十一种行为型模式

这个设计模式主要思考的是如何分配对象的职责和将对象之间相互协作完成单个对象无法完成的任务,这个与结构型模式有点像,结构型可以理解为静态的组合,例如将不同的组件拼起来成为一个更大的组件;而行为型更是一种动态或者具有某个动作触发的事件,具有一定行为的设计模式。现在不清楚没关系,学完23种设计模式再回头看就能理解了。行为型模式包括:模板方法模式、策略模式、命令模式、职责链模式、状态模式、观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式、解释器模式共11种。

2024-01-19 14:30:39 1237

原创 设计模式篇章(3)——七种结构型模式

结构型设计模式主要思考的是如何将对象进行合理的布局来组成一个更大的功能体或者结构体,这个现在讲有点抽象,用大白话讲就是利用现有的对象进行组合或者配合,使得组合后的这个系统更加好。好是相对于不使用设计模式,按照自己的堆屎山的逻辑堆成一个冗余的系统。结构型模式包括:享元模式、外观模式、桥接模式、适配器模式、装饰模式、代理模式、组合模式七种设计模式。接下来,按照从易到难进行介绍!

2024-01-07 18:11:23 561

原创 设计模式篇章(2)——五种创建者模式

创建者模式主要思考如何创建一个对象,如何将对象的创建与使用分离。一般初级程序员都是new一个对象,然后紧接着使用这个对象,在某些场景中这样子是有问题的,需要使用创建者模式替代的(例如使用单例模式)。设计模式中提供了五种创建模型,分别是单例、原型、工厂方法、抽象工厂方法、创建者五种模式。

2024-01-05 14:29:30 848

原创 设计模式篇章(1)——理论基础

设计模式:在软件开发中会面临许多不断重复发生的问题,这些问题可能是代码冗余、反复修改旧代码、重写以前的代码、在旧代码上不断堆新的代码(俗称屎山)等难以扩展、不好维护的问题。因此1990年有四位大佬(GoF组合)合作出了一本书,叫做《设计模式:可复用面向对象软件的基础》,它比较完美地解决了在软件工程当中所遇到的上述问题,即给出了如果遇到上述问题的标准答案!

2024-01-03 20:43:08 531

原创 Netty篇章(1)—— 核心原理介绍

Netty是一个Java NIO客户端/服务器框架,是一个为了快速开发可维护的高性能、高可扩展的网络服务器和客户端程序而提供的异步事件驱动基础框架和工具。如果要开发一个网络通信模块,那么Netty是首选,知名的Dubbo、Zookeeper、RocketMQ 网络通信模块全都是Netty实现的,我发现阿里的分布式框架网络通信模块很喜欢使用Netty作为网络通信框架。Netty的目标之一,是使通信开发可以做到“快速和轻松”。

2024-01-22 18:09:44 996

原创 Java-NIO篇章(5)——Reactor反应器模式

Reactor就是一种网络编程的设计模式,如果不知道Reactor那么学Netty的时候会非常困难,因为很多概念就是Reactor,因此学会了Reactor在学Netty就非常简单。其次,懂得高并发中间件的网络通信设计的底层原理对提升自己的技术也是非常重要的,所以,学习像Netty这样的“精品中的精品”框架,肯定也是需要先从设计模式入手的。而Netty的整体架构,就是基于这个著名反应器模式。

2024-01-21 20:29:37 1236

原创 不同线程之间如何传参?

假设在主线程中的某个对象需要传入到另外一个线程中进行处理,那么两个线程之间如何传递参数?例如:主程序中有个字符串,使用异步子线程进行空格拆分,结果应该输出hello和world。

2024-01-21 20:25:06 616

原创 Java-NIO篇章(4)——Selector选择器详解

选择器的使命是完成IO的多路复用,其主要工作是通道的注册、监听、事件查询。一个通道代表一条连接通路,通过选择器可以同时监控多个通道的IO(输入输出)状况。选择器和通道的关系,是监控和被监控的关系。 选择器提供了独特的API方法,能够选出(select)所监控的通道已经发生了哪些IO事件,包括读写就绪的IO操作事件。 一般是一个单线程处理一个选择器,一个选择器可以监控很多通道。所以,通过选择器,一个单线程可以处理数百、数千、数万、甚至更多的通道。在极端情况下(数万个连接),只用一个线程就可以处理所有的通道。

2024-01-19 13:25:08 1057

原创 Java-NIO篇章(3)——Channel通道类详解

Java NIO中,一个socket连接使用一个Channel(通道)来表示。对应到不同的网络传输协议类型,在Java中都有不同的NIO Channel(通道) 相对应。其中最为重要的四种Channel(通道)实现: FileChannel、 SocketChannel、 ServerSocketChannel、 DatagramChannel。

2024-01-18 14:01:18 1211 1

原创 Java-NIO篇章(2)——Buffer缓冲区详解

Buffer类是一个抽象类,对应于Java的主要数据类型,在NIO中有8种缓冲区类,分别如下: ByteBuffer、 CharBuffer、 DoubleBuffer、 FloatBuffer、 IntBuffer、 LongBuffer、 ShortBuffer、MappedByteBuffer。 本文以它的子类ByteBuffer类为例子讲解。ByteBuffer子类就拥有一个byte[]类型的数组成员final byte[] hb,作为自己的读写缓冲区,数组的元素类型与Buffer子类的操作类型相

2024-01-17 19:17:17 1168

原创 Java-NIO 开篇(1)

高性能的Java通信,离不开Java NIO组件,现在主流的技术框架或中间件服务器,都使用了Java NIO组件,譬如Tomcat、 Jetty、 Netty、Redis、RabbitMQ等的网络通信模块。在1.4版本之前, Java IO类库是阻塞式IO;从1.4版本开始,引进了新的异步IO库,被称为Java New IO类库,简称为Java NIO。 称“老的”阻塞式Java IO为OIO(Old IO)。总体上说, NIO弥补了原来面向流的OIO同步阻塞的不足。

2024-01-17 15:46:46 1233

原创 行为型设计模式——命令模式

将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增加与管理

2024-01-14 13:06:49 1215

原创 行为型设计模式——中介者模式

中介者模式主要是将关联关系由一个中介者类统一管理维护,一般来说,同事类之间的关系是比较复杂的,多个同事类之间互相关联时,他们之间的关系会呈现为复杂的网状结构,这是一种过度耦合的架构,即不利于类的复用,也不稳定。中介者模式又叫调停模式,定义一个中介角色来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。

2024-01-14 12:23:59 995

原创 行为型设计模式——备忘录模式

备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原,很多软件都提供了撤销(Undo)操作,如 Word、记事本、Photoshop、IDEA等软件在编辑时按 Ctrl+Z 组合键时能撤销当前操作,使文档恢复到之前的状态;还有在 浏览器 中的后退键、数据库事务管理中的回滚操作、玩游戏时的中间结果存档功能、数据库与操作系统的备份操作、棋类游戏中的悔棋功能等都属于这类。

2024-01-13 22:49:49 1265

原创 行为型设计模式——迭代器模式

提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示

2024-01-13 22:30:21 1070

原创 行为型设计模式——观察者模式

观察者模式也不难,这个模式用大白话将就是若干个观察者类都订阅一个发布类(被观察者类),当发布者需要发表消息的时候,观察者都能够收到消息。定义:又被称为发布-订阅(`Publish/Subscribe`)模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。

2024-01-12 15:31:29 1000

原创 行为型设计模式——状态模式

状态模式是比较简单的设计模式,它的主要作用是减少代码中大量的 if-else 或者 switch-case 等逻辑判断(俗称屎山)。它将每个状态定义为一个类,而每个状态类有自己对应的方法,因此当需要根据状态执行逻辑代码时不需要写大量的if-else判断是哪个状态然后执行对应的逻辑,而只需要创建某个状态对象,直接调用它对应的方法即可。定义:对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。

2024-01-12 14:42:07 1216

原创 行为型设计模式——责任链模式

又名职责链模式,为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。用大白话讲,就是一个任务,有多个处理类可以进行处理,但是多个处理类只有一个处理类可以处理它,这需要根据这个任务类的本身情况决定,因此需要将这个任务按照处理类的顺序进行处理,我们只需要将这个任务丢给第一个处理类即可返回结果,因为它如果无法处理会自动转交给下一个更强的处理类,一直找到合适的处理类为止,否则返回null。

2024-01-11 20:00:21 1305

原创 行为型设计模式——策略模式

策略模式非常简单,只需要将策略或者某个算法定义成一个类,然后传给需要使用的对象即可。定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。

2024-01-11 19:41:30 1035

原创 行为型设计模式——模板方法模式

在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关。例如拿泡茶这件事来说,可以分为4个步骤,第一步洗茶具,第二步烧开水,第三步放入茶叶并根据不同的茶叶泡不同的时间,第四步品茶。以上的一二四步都是一样的,只有第三步不一样,因此可以将一二四步具体实现好,即模板方法。第三步则是用户自己需要实现的方法,即抽象方法。

2024-01-10 13:01:33 1152

原创 结构型设计模式——装饰器模式

装饰者模式指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式。就好比一个姑娘化妆,化完妆之后其实还是本人,只不过是多了一些功能,变好看了。因此,初学者可以简单理解成,装饰者模式就是外界传入一个对象(可以是构造方法也可以是set方法传入对象),对这个对象进行一些次要功能增强,然后返回的还是这个对象。这一点和代理模式有点点像,这里先不做区分。我们先来看一个快餐店的例子。

2024-01-09 13:30:42 1174

原创 结构型设计模式——适配器模式

这个更加好理解,就是做适配功能的类,例如,现在手机没有了圆形耳机接口,只有Type-C接口,因此你如果还想要使用圆形耳机的话需要买个圆形接口转Type-C的转换器(适配器),这就是所谓的适配器,将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。适配器模式分为类适配器模式和对象适配器模式,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。

2024-01-09 13:03:10 1233

原创 结构型设计模式——桥接模式

如果一个系统需要在抽象化和具体化之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系,通过桥接模式可以使它们在抽象层建立一个关联关系(参考案例:即视频文件格式对象成为操作系统类的一个成员变量)。“抽象部分”和“实现部分”可以以继承的方式独立扩展而互不影响(参考案例:操作系统和视频文件分别继承自己的父类),在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合(组合就是视频文件对象成为操作系统对象的一个成员变量或者讲属性),即系统需要对抽象化角色和实现化角色进行动态耦合。

2024-01-08 12:40:49 1153

原创 结构型设计模式——外观模式

外观(Facade)模式是“迪米特法则”的典型应用,还记得这个“迪米特法则”吗?如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。下图中的系统内部是很复杂的,左边这个系统对外的调用关系更是很乱的,内部的不堪直接暴露给观众。而使用外观模式,则可以设置一个门面或者叫做代理对象,统一由这个门面来对外提供简单的、整洁的调用接口。这就是外观模式!

2024-01-08 12:18:34 598

原创 结构型设计模式——享元模式

享元模式是结构型模式中最简单的一个模式,享是共享的意思,元是最小单元或细小的对象的意思。也就是说对一些需要大量重复使用的很细的对象进行缓存,缓存了就可以重复使用,例如Integer类中对整型-128到127进行了缓存,使用的正是享元模式。它有点类似单例模式,不过单例模式只共享一个类的唯一对象,而享元模式是共享多个类的唯一对象。给出定义如下:运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销,从而提高系统资源的利用率。

2024-01-07 18:01:18 1047

原创 Java枚举类全网最易懂讲解

今天有个同学说他没怎么用过枚举类让我给他讲解一下,他说看了这么多博客还是一团雾水。然后我搜了一下,发现都是写的啥呀!我来,如果这篇博客你还听不懂请狂喷我,暴躁老哥立马上线写下此版本,废话少说,下面开始介绍。

2024-01-04 14:34:33 810

原创 Java异步回调的实现

在Java中,异步回调是一种常见的编程模式,用于处理异步操作和事件驱动的场景。异步回调通常用于处理耗时的任务,以避免阻塞主线程,提高应用程序的性能和响应性。大白话来讲就是方法A调用方法B的一种实现过程,其中方法B是非常耗时的,异步回调机制就是让方法A调用方法B但不阻塞当前线程,且方法B执行完后会自动调用方法A的一个指定的方法(往往在这里就是将结果传回来处理)。

2023-12-26 16:01:22 418

原创 状态模式——状态转换的优化神器

状态模式(State Pattern)是一种行为型设计模式,它允许对象在其内部状态发生变化时改变其行为。状态模式的核心思想是将对象的状态封装成不同的类,并在对象内部维护一个指向当前状态的引用。这使得对象在不同状态下具有不同的行为,而且可以在运行时动态切换状态。其实这有点像策略模式,共同点都是是传入的状态|策略对象来驱动行为。下面给出例子并说明使用状态模式和不使用状态模式实现状态转换功能的区别。

2023-12-06 14:56:03 110

原创 异步任务线程池——最优雅的方式创建异步任务

对于刚刚从校园出来的菜鸡选手很容易写出自以为没问题的屎山代码,可是当上线后就会立即暴露出问题,这说到底还是基础不够扎实!只会背八股文,却不理解,面试头头是道,一旦落地就啥也不是。此处,抛出几个八股文:为什么要使用线程池?使用Executors的工厂类创建的线程池会有什么问题?阿里为什么推荐使用标准构造器创建线程池?使用线程池提交任务submit和execute有啥不一样吗?等等,如果以上的问题你回答不出,那么你距离一个中级软件工程师还有很大差距!我建议系统性学习一下,如果只是想知道答案可以访问我的相关博客。

2023-11-18 16:43:10 181

原创 try-with-resources(TWR)方式关闭流资源

使用传统的方式关闭流资源当然没问题,但是需要写的代码有点多,而是Java 7 之后的新语法糖,旨在减轻开发人员释放try块中使用的资源的压力。一时用TWR方式一时爽,一直用一直爽,但是有些情况也是不能使用这种方式的,但是绝大多数时候是可以使用的,下面进行详细的介绍。

2023-11-17 14:19:44 243

原创 策略模式的应用——应对频繁的需求变更

在工作中,往往我们的需求是多变的,那么如果我们只是简单的硬编码解决暂时的需求,那么当需求进行变更的时候我们的接口就需要变更来应对新的需求。但是有些情况下我们可以写一些通用接口来因对这种变化,即把频繁变化的东西提取出来,交给接口调用者来设计。在这种情况下,我们的接口就无需变化,而当需求变化了只需要重写频繁变化的对象即可。这就是策略模型的一种应用,接下来将用具体的例子来说明这种编码方式的具体实现。

2023-11-15 16:33:12 409

原创 Lambda表达式常见用法(提高效率神器)

Java8中一个非常重要的特性就是Lambda表达式,我们可以把它看成是一种闭包,它允许把函数当做参数来使用,是面向函数式编程的思想,一定程度上可以使代码看起来更加简洁。其实以上都不重要,重要的是能够提高我的开发效率,为了工作效率避免无意义加班,使用Lambda表达式只能说好爽!一时用一时爽,一直用一直爽!但是学习可能很多人觉得很复杂于是放弃了,可读性确实很不好,我的建议是死记规则,学习常用的Lambda表达式就够了。

2023-09-28 15:39:28 211

原创 最常见的设计模式(代码示例)

设计模式是前人大佬总结出来的一套代码设计的规范,好处就是代码可重用、容易理解、最主要的是代码复用很整齐,而不是东一个类西一个类。懂设计模式才能能加容易看懂一些框架源码,更重要的是公司里的大佬写的项目可以接手且能看懂。追求优雅地编程。

2023-07-27 11:06:24 283

原创 AQS抽象同步队列核心原理

当线程调用await()方法时,说明当前线程的节点为当前AQS队列的队首节点,正好处于占有锁的状态, await()方法需要把该线程从AQS队列挪到Condition等待队列里。非公平同步器ReentrantLock.NonfairSync的核心思想就是当前进程尝试获取锁的时候,如果发现锁的状态位是0,就直接尝试将锁拿过来,然后执行setExclusiveOwnerThread(),根本不管同步队列中的排队节点。队列的队首节点(队列的头部)表示占有锁的节点,新加入的抢锁线程则需要等待,会插入到队列的尾部。

2023-07-27 10:26:16 148 1

原创 CLH自旋锁原理

在争夺锁激烈的情况下,为了减少CAS空自旋(CAS需要CPU进行内部通信保证缓存一致性造成流量过大引起总线风暴),Java轻量级锁会升级为重量级锁,那么JUC基于CAS实现的轻量级锁如何避免总线风暴呢?CLH锁其实就是一种是基于队列(具体为单向链表)排队的自旋锁,申请加锁的线程首先会通过CAS操作在单向链表的尾部增加一个节点,之后该线程只需要在其前驱节点上进行。抢锁线程在队列尾部加入一个节点,然后仅在前驱节点上做普通自旋,它不断轮询前一个节点状态,如果发现前一个节点释放锁,当前节点抢锁成功。

2023-07-21 20:06:53 214

原创 JWT数字签名与token实现

JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。什么时候你应该用JSON Web Token?Authorization (授权) : 这是使用JWT的最常见场景。一旦用户登录,后续每个请求都将包含JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是现在广泛使用的JWT的一个特性,因为它的开销很小,并且可以轻松地跨域使用。

2023-06-28 11:57:48 1927

原创 Hibernate Validator 组件

Hibernate Validator 是一个基于 Java 的验证框架,它提供了强大且灵活的验证功能,用于验证 JavaBean 对象的状态。它是基于 JSR 380 规范(Bean Validation 2.0)的实现,并且可以与任何 Java 应用程序集成。Hibernate Validator 的目标是提供一种方便、易于使用的验证机制,以确保数据的完整性和一致性。它可以用于验证表单输入、数据传输对象(DTO)、实体对象等各种类型的数据。

2023-06-27 18:31:35 666

原创 Swagger与knife4j接口文档组件详解

相信无论是前端还是后端开发,都或多或少地被接口文档折磨过。前端经常抱怨后端给的接口文档与实际情况不一致。后端又觉得编写及维护接口文档会耗费不少精力,经常来不及更新。其实无论是前端调用后端,还是后端调用后端,都期望有一个好的接口文档。但是这个接口文档对于程序员来说,就跟注释一样,经常会抱怨别人写的代码没有写注释,然而自己写起代码起来,最讨厌的,也是写注释。所以仅仅只通过强制来规范大家是不够的,随着时间推移,版本迭代,接口文档往往很容易就跟不上代码了。

2023-06-25 18:54:57 1322

原创 Lombok详细笔记

lombok是一个开源的代码生成库,能以简单的注解形式来简化Java类中的大量样板代码,提高开发人员的开发效率。例如开发中经常需要写的javabean,都需要花时间去添加相应的getter/setter,也许还要去写构造器、equals等方法,而且需要维护,当属性多时会出现大量的getter/setter方法,这些显得很冗长也没有太多技术含量。lombok能通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法,使代码看起来更简洁。

2023-06-25 14:26:35 1800

原创 SpringBoot自定义注解—AOP方式和拦截器方式实现

相信很多小伙伴和我一开始一样,对SpringBoot的注解了解只是一知半解,只知道注解仅仅是作为一个标识,并继承自Annotation这一接口,使用@interface定义。但是对于注解具体的实现逻辑却找不到代码去看,因此本篇博客就详细来讲清楚SpringBoot自定义一个功能复杂的注解。

2023-06-25 13:05:29 2133 1

hello-spring-boot-starter

自定义spring boot Starter,请参考博文:https://blog.csdn.net/cj151525/article/details/131366473?spm=1001.2014.3001.5501 Spring Boot starter 我们知道Spring Boot大大简化了项目初始搭建以及开发过程,而这些都是通过Spring Boot提供的starter来完成的。在实际项目中一些基础模块其本质就是starter,所以我们需要对Spring Boot的starter有一个全面深入的了解,这是我们的必备知识。 starter介绍 spring boot 在配置上相比spring要简单许多, 其核心在于spring-boot-starter, 在使用spring boot来搭建一个项目时, 只需要引入官方提供的starter, 就可以直接使用, 免去了各种配置。starter简单来讲就是引入了一些相关依赖和一些初始化的配置。

2023-06-24

cascade.xml

该文件是用了330张正样本,1100左右负样本跑出的xml文件,个人觉得泛化性比较强,负样本与正样本的相似性应该要更大。后面会试验!这个效果总的来说可以识别人脸戴口罩。

2020-03-20

mask_data.zip

这就是一些戴口罩的人脸图片,适合一些小型的数据分析与训练,图片不多,大概500张,需要处理哦。没有积分的朋友留下邮箱给你。谢谢啦

2020-03-20

haarcascades.zip

OpenCv haarcascades xml 文件,包含人脸识别,猫脸识别,微笑识别等等所有OpenCv自带模型。

2020-03-20

未来教育全套考试系统

计算机考试一到四级所有科目全部免费,免安装,近百元的资源只要一个积分,之后全部免费免费

2018-10-06

未来教育考试系统

包括了计算机考试一级,二级,三级,四级全部科目,刷题系统全部破解免费。所有都免费,免安装。价值百元的资源

2018-09-23

空空如也

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

TA关注的人

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