自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

皮球

越自律越自由

  • 博客(138)
  • 收藏
  • 关注

原创 设计模式_外观模式_Facade

外观模式,也叫“过程模式”外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得各个子系统更加容易使用使用外观模式可以为互相关联在一起的错综复杂的类整理出高层接口(API)。其中的Facade角色可以让系统对外只有一个简单的接口(API)。而且,Facade 角色还会考虑到系统内部各个类之间的责任关系和依赖关系,按照正确的顺序调用各个类。定义一个一致的接口,用于屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节。

2024-02-04 13:43:29 878

原创 设计模式_责任链模式_Chain

职责链模式又叫责任链模式,为请求创建了一个接收者对象的链(如下方的简单示意图)。这种模式对请求的发送者和接收者进行解耦。当发送者发送一个请求之后,接收者会按照职责链的顺序一个一个地找出到底应该由谁来负责处理这个请求职责链模式通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推,如果所有人都不能处理,最后就会提示或者报错说不能处理这种类型的设计模式属于行为型模式【优点】将请求和处理分开,实现解耦,提高系统的灵活性。

2024-02-02 10:18:26 1393

原创 设计模式_策略模式_Strategy

策略模式中,定义算法族,分别封装到不同的类中,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。使用策略模式可以整体地替换算法的实现部分,让我们可以轻松地以不同的算法去解决同一个问题该模式体现了几个设计原则:把变化的代码从不变的代码中分离出来;针对接口编程而不是具体类(定义了策略接口);多用组合/聚合,少用继承(客户通过组合方式使用策略)【说明】策略模式的关键是分析项目中变化部分与不变部分【优点】策略模式的核心思想是:多用组合/聚合,少用继承;用行为类来组合,而不是行为的继承。

2024-02-02 10:13:59 1543

原创 设计模式_状态模式_State

状态模式: 它主要用来解决对象在多种状态转换时,需要对外输出不同的行为的问题。状态和行为是一一对应的(如果处于A状态,就拥有A状态所拥有的行为和操作),状态之间可以相互转换当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是变成了另外一个类的对象在状态模式中,使用类来表示状态,可以通过切换类来改变对象的状态,当需要增加新的类时,也只需要增加新的类即可【优点】代码有很强的可读性,状态模式将每个状态的行为封装到对应的一个类中方便维护。

2024-02-01 09:18:49 1451

原创 设计模式_解释器模式_Interpreter

在解释器模式中,程序要解决的问题会被用非常简单的“迷你语言”表述出来,即用“迷你语言”编写的迷你程序把具体的问题表述出来。迷你程序是无法单独工作的,我们还需要用Java语言编写一个负责“翻译”(interpreter)的程序。翻译程序会理解迷你语言并解释迷你语言,最后运行迷你程序。这段翻译程序也被称为解释器。这样,当需要解决的问题发生变化时,不需要修改 Java语言程序,只需要修改迷你语言程序即可应对。

2024-02-01 09:12:47 1131

原创 设计模式_备忘录模式_Memento

备忘录模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态可以这样理解备忘录模式: 现实生活中的备忘录是用来记录某些要去做的事情或者是记录已经达成的共同意见的事情,以防忘记。而在软件层面,备忘录对象主要用来记录一个对象的某种状态,或者某些数据,当要做回退时,可以从备忘录对象里获取原来的数据进行恢复操作备忘录模式属于行为型模式【优点】给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回退到某个历史的状态。

2024-01-31 09:51:53 1051

原创 设计模式_迭代器模式_Iterator

迭代器模式属于行为型模式如果我们的元素集是用不同的方式实现,有数组、java的集合类或其他方式,当客户端要遍历这些元素集的元素的时就要使用多种遍历方式,而且还会暴露元素的内部结构,这时可以考虑使用迭代器模式解决迭代器模式提供一种遍历元素集元素的统一接口,用一致的方法遍历元素集的元素,不需要知道元素集对象的底层表示,即不需要暴露元素集对象内部的结构【优点】提供一个统一的方法来遍历不同的元素集中的对象,客户不用再考虑元素集的类型,使用一种方法就可以遍历对象了。

2024-01-31 09:46:40 1046

原创 设计模式_观察者模式_Observer

观察者模式的工作原理:观察者到观察对象中进行注册,当观察对象的状态发生改变时,就通知已经注册的观察者,观察者可以被从观察对象中移除可替换性强:被观察对象中的观察者集合的观察者类型是Observer角色,可以接收各种各样的具体Observer角色,而且可以统一调用他们的update方法;Observer的update方法接收的数据类型也是Subject,在update方法里面也可以统一调用方法来获取具体被观察对象的属性update方法所需要的参数非常灵活,可以自己按照需求来定义。

2024-01-30 08:59:57 1343

原创 设计模式_中介者模式_Mediator

在中介者模式中,团队组员之间不再互相沟通并私自做出决定,而是发生任何事情都向中介者报告,中介者站在整个团队的角度上对组员上报的事情做出决定。当中介者下达指示时,组员会立即执行用一个中介对象来封装一系列的对象交互方法。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互中介者模式属于行为型模式在MVC模式中,C(Controller控制器) 是M(Model模型) 和V(View视图)的中介者,在前后端交互时起到了中间人的作用【优点】

2024-01-30 08:59:22 895

原创 设计模式_访问者模式_Visitor

在数据结构中保存着许多元素,我们会对这些元素进行“处理”。这时,“处理”代码放在哪里比较好呢?通常的做法是将它们放在表示数据结构的类中。但是,如果“处理”有许多种呢?这种情况下,每当增加一种处理,我们就不得不去修改表示数据结构的类。在Visitor模式中,数据结构与处理被分离开来。我们编写一个表示“访问者”的类来访问数据结构中的元素,并把对各元素的处理交给访问者类。这样,当需要增加新的处理时,我们只需要编写新的访问者,然后让数据结构可以接受访问者的访问即可即访问者模式主要将数据结构与数据操作。

2024-01-25 10:53:46 1245

原创 设计模式_命令模式_Command

一个类在进行工作时会调用自己或是其他类的方法,虽然调用结果会反映在对象的状态中,但并不会留下工作的历史记录。这时,如果有一个类用来表示“请示进行这项工作”的“命令”就会方便很多。每一项想做的工作就不再是“方法的调用”这种动态处理了,而是一个表示命令的类的实例,即可以用“物”来表示。要想管理工作的历史记录,只需管理这些实例的集合即可,而且还可以随时再次执行过去的命令,或是将多个过去的命令整合为一个新命令并执行。这样的模式称为命令模式命令模式使得请求发送者与请求接收者。

2024-01-25 10:48:04 1196

原创 设计模式_模板方法模式_TemplateMethod

模板方法模式,又叫模板模式,在一个抽象类中定义了一个执行它的其他方法的公开模板方法,子类可以按需重写抽象类的抽象方法简单说,模板方法模式 定义一个操作中的算法(或者说流程)的骨架,而将一些步骤下放到子类中实现,使得子类可以在不改变算法结构的基础上,可以重新定义算法的某些步骤该模式属于行为型模式通过添加不同的配料,可以制作出不同口味的豆浆制作豆浆的流程:选材—>添加配料—>浸泡—>放到豆浆机打碎,这几个步骤对于制作每种口味的豆浆都是一样的【优点】既统一了算法,也提供了很大的灵活性。

2024-01-24 16:18:08 1423

原创 设计模式_代理模式_Proxy

代理模式为一个对象提供一个代理对象,以控制对这个对象的访问。即通过代理对象访问目标对象,这样做的好处是:可以在不修改目标对象代码的基础上,增强额外的功能操作,即扩展目标对象的功能被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象代理模式有不同的形式,主要有静态代理动态代理和Cglib代理三种形式静态代理在使用时,需要定义接口或者父类,被代理对象(即目标对象)与代理对象一起实现相同的接口或者是继承相同父类。

2024-01-24 16:14:16 1790

原创 设计模式_享元模式_Flyweight

享元模式,也叫蝇量模式: 通过尽量共享实例来避免new出新的实例,让程序占用的内存更小常用于系统底层开发,解决系统的性能问题。像数据库连接池,里面都是创建好的连接对象,在这些连接对象中如果有我们需要的则直接拿来用,避免重新创建,如果没有我们需要的,则创建一个享元模式能够解决重复对象的内存浪费的问题,当系统中有大量相似对象,需要缓冲池时。不需总是创建新对象,可以从缓冲池里拿。这样可以降低系统内存,同时提高效率(如先创建好棋盘对象,用户开始下棋时,直接从缓冲池中获取这个棋盘对象返回即可)享元模式。

2024-01-23 01:16:02 903

原创 设计模式_组合模式_Composite

组合模式,又叫部分整体模式(描述部分和整体的关系),它创建了对象组的树形结构,将对象组合成树状结构以表示“整体-部分”的层次关系组合模式依据树形结构(容器中可以放入内容,也可以放入小容器,小容器中又可以放入内容或者更小的容器)来组合对象,用来表示部分以及整体层次。组合模式可以使容器与内容具有一致性,创造出递归结构组合模式属于结构型模式组合模式使得用户对单个对象和组合对象的访问具有一致性,组合能让客户以一致的方式处理个别对象以及组合对象简化客户端操作。

2024-01-23 01:12:26 982

原创 设计模式_装饰器模式_Decorator

动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更好,装饰者模式也体现了开闭原则(ocp)假如有一块蛋糕,如果加上奶油,就变成了奶油蛋糕;再加上草莓,就变成了草莓奶油蛋糕。整个过程就是在不断装饰蛋糕的过程。根据装饰者模式编写的程序的对象与蛋糕十分相似。首先有一个相当于蛋糕的对象,然后像不断地装饰蛋糕一样地不断地对其增加功能,它就变成了使用目的更加明确的对象。在装饰者模式中,装饰者与被装饰者具有一致性。

2024-01-22 15:28:37 1096

原创 设计模式_桥接模式_Bridge

桥接模式(Bridge模式)是指: 将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变。Bridge 的意思是“桥梁”。就像在现实世界中,桥梁的功能是将河流的两侧连接起来一样Bridge 模式的作用也是将两样东西连接起来,它们分别是类的功能层次结构和类的实现层次结构。是一种结构型设计模式Bridge模式基于类的最小设计原则(实现功能的同时,让类尽可能少),通过使用封装、聚合及继承等行为让不同的类承担不同的职责。

2024-01-22 15:22:28 1134

原创 设计模式_工厂模式_Factory

简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式工厂方法模式设计方案:将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐子类中具体实现。定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类。

2024-01-20 09:52:26 978

原创 设计模式概述与图解

1)对于数据类型是基本数据类的成员变量,浅拷贝会直接进行值传递,也就是将该属性值复制一份给新的对象。2)对于数据类型是引用数据类型的成员变量,比如说成员变量是某个数组、某个类的对象等,那么浅拷贝会进行引用传递,也就是只是将该成员变量的引用值(内存地址)复制一份给新的对象。因为实际上两对象的该成员变量都指向同一个实例。在这种情况下,在一个对象中修改该成员变量会影响到另一个对象的该成员变量值3)前面的克隆羊是浅拷贝4)浅拷贝是使用默认的clone()方法来实现。

2024-01-20 09:46:10 1335

原创 设计模式_适配器模式_Adapter

适配器模式将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)适配器模式属于结构型模式(没有产生什么新对象,只是结构的一些调整,让类与类之间可以协调工作)Adapter类,通过继承src类,实现 dst 类接口,完成src->dst的适配如生活中的小例子:充电器本身相当于Adapter,220V交流电相当于src(即被适配者),我们的dst(即目标)是5V直流电。

2024-01-19 13:48:01 871

原创 设计模式_原型模式_Prototype

原型模式指用通过拷贝原型实例创建新的实例,新实例和原型实例的属性完全一致原型模式是一种创建型设计模式工作原理是通过调用原型实例的clone()方法来完成克隆,原型实例需要实现Cloneable接口,并重写clone()方法需要为每个类开发一个克隆方法,这对全新的类来说不难,但对已有类进行改造时,需要修改其源代码,违背了ocp原则实现深拷贝的时候可能需要比较复杂的代码。

2024-01-19 11:21:44 886

原创 设计模式_建造者模式_Builder

建造者模式又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同属性的对象建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,不需要知道内部的具体构建细节(如用户在选购汽车的时候,只需要选择好方向盘、轮胎、发动机类型,不需要知道零件是怎么制造出来的)

2024-01-18 09:05:11 846

原创 设计模式_单例模式_Singleton

所谓类的单例设计模式,就是采取一定的方法,保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。比如Hibernate的SessionFactory,它充当数据存储源的代理,并负责创建Session对象。SessionFactory并不是轻量级的,一般情况下,一个项目通常只需要一个SessionFactory就够,这是就会使用到单例模式。单例模式保证了系统内存中该类只存在一个对象,节省了系统资源,

2024-01-18 09:04:15 912

原创 SpEL表达式各数据类型基本使用举例

SpEL是Spring提供的一种的表达式语言,支持在运行时查询和操作对象。SpEL并不直接与Spring相关联,可以独立使用。

2024-01-16 22:04:30 1160

原创 基于Jackson的Json工具类

【代码】基于Jackson的Json工具类。

2024-01-16 22:03:38 769

原创 详解Mybatis应用的设计模式

为什么学设计模式、看框架源码、补技术知识,就一个普通的业务项目,会造飞机不也是天天写CRUD吗?你说的没错,但你天天写CRUD,你觉得烦不?慌不?是不是既担心自己没有得到技术成长,也害怕将来没法用这些都是CRUD的项目去参加述职、晋升、答辩,甚至可能要被迫面试时,自己手里一点干货也没有的情况。所以,当然要扩充自己的知识储备,否则架构,架构思维不懂、设计,设计模式不会、源码、源码学习不深,最后就用一堆CRUD写简历吗?

2023-11-14 17:06:46 174

原创 UML类图_六大关系_Idea插件绘制

学习设计模式必不可少的一项能力就是能读懂UML类图,能够将自己的设计思路绘制成UML类图便于相互交流,其实稍有经验的程序员应该对UML类图都不陌生,因为我们平常会使用很多二次开发包,一般二次开发包都会提供一份包含本开发包的所有类相关的UML类图,通过UML类图可以让程序员快速的了解开发包中各个类的功能以及各个类之间的关系。

2023-11-14 16:04:56 344

原创 基于Nacos简化本地Feign调用

在平常的工作中,OpenFeign作为微服务间的调用组件使用的非常普遍,接口配合注解的调用方式突出一个简便,让我们能无需关注内部细节就能实现服务间的接口调用。但是工作中用久了,发现Feign也有些使用起来麻烦的地方,下面先来看一个问题,再看看我们在工作中是如何解决,以达到简化Feign使用的目的。

2023-10-31 10:18:10 235

原创 Feign核心源码解析

这里完成的是将FeignClient注解的类的信息交给工厂bean代理类,并将代理类的定义注册到Spring的容器中。这个问题我们放在后面去证实。至此,已经把要创建的接口代理对象的信息放入registry里面,之后spring在启动调用refresh方法的时候会负责bean的实例化。进入RibbonRequest的构造方法中,可以看见,用的Client的实现类是Client$Default对象,即前面讲到的在配置文件中,LoadBalancerFeignClient中delegate存储的对象。

2023-10-31 10:17:08 162

原创 Springboot扩展点_Bean生命周期

相信大多数的java项目都会使用Spring、Springboot,可以这样回答:Springboot实际上按约定大于配置的开发原则,对Spring原来XML配置的方式进行简化、包装,可以达到开箱即用,简化开发,提高开发效率,但是其核心依然是Spring。(话锋一转,开始往Spring生命周期上引),而Spring的最重要的核心是IOC,IOC管理的对象就是Spring bean,Spring bean生命周期内的又提供了各种优秀扩展接口和内部实现,也可以根据业务需要自定义实现,非常灵活和方案。

2023-10-30 15:14:52 248

原创 Springboot扩展点系列_DisposableBean

从单元测试的执行结果来看,Spring容器关闭后,会触发执行DisposableBean#destroy()扩展方法的执行,所以如果我们的业务开发中,如果某些Bean在容器关闭后,需要做一些释放业务资源之类的操作,就能用到这个扩展点了。其实是这样的,你仔细观察会发现,触发Dog.destroy()方法执行并不是主线程,而是叫做SpringContextShutdownHook的线程,这里用到了多线程技术,单元测试执行完了,才触发Dog.destroy()方法执行是多线程异步执行的原因。

2023-10-30 15:11:29 139

原创 Springboot扩展点系列_CommandLineRunner和ApplicationRunner

2、CommandLineRunner和ApplicationRunner的扩展点方法的调用逻辑,其实也是简单易懂,先把所有CommandLineRunner和ApplicationRunner的实现类汇总到一个集合,然后循环遍历这个集合,在集合里判断,如果ApplicationRunner的实现类,则先执行;4、CommandLineRunner和ApplicationRunner触发执行时机是在Spring容器、Tomcat容器正式启动完成后,可以正式处理业务请求前,即项目启动的最后一步;

2023-10-27 09:22:09 119

原创 Springboot扩展点系列_FactoryBean

FactoryBean是一个工厂Bean,在需要创建比较复杂的bean的时候可以用到,BeanFactory是Spring bean容器的根接口,也就是说实现BeanFactory,可以得到一个最基础的Spring容器,Spring中的所有高级容器都继承了这个根接口。而实现了FactoryBean接口,getBean(“computeFactoryBean”)的结果的是getObject()方法中返回的结果,即computer,这就是FactoryBean如此神奇的地方。如果不是,则继续向下执行;

2023-10-27 09:18:56 154

原创 Springboot扩展点系列_SmartInitializingSingleton

1、定义Dog类,以setter注入方式进行属性注入,同时Dog类实现SmartInitializingSingleton接口,重写afterSingletonsInstantiated(),并在方法内部打印日志,如果在实际业务开发过程中用到了这个扩展点,相关的扩展操作逻辑就是在这个方法内实现;关于Spring bean有七种作用域:默认singleton(单例)、prototype、request、session、globalSession、application、websocket;

2023-10-26 15:20:09 38

原创 Springboot扩展点系列_InitializingBean

到这里InitializingBean#afterPropertiesSet方法和init-method是什么时候开始调用,是用什么方式来调用的呢,已经分析清楚了,同时还了解到InitializingBean#afterPropertiesSet方法和init-method有类似的效果,执行时机也比较接近,但是是两个完全不同的东西,且InitializingBean#afterPropertiesSet方法的执行时机要稍早于init-method。是用什么方式来调用的呢?

2023-10-26 15:13:57 315

原创 Springboot扩展点系列_PostConstruct

从以上几步的分析来看,被@PostConstruct标记的方法是怎么被执行的,这个问题回答清楚了。你就可以这么回答他:在Bean实例化、属性注入后,被@PostConstruct标记的方法是在BeanPostProcessor的扩展方法postProcessBeforeInitialization()触发执行的,具体实现类是InitDestroyAnnotationBeanPostProcessor,具体的逻辑是:先查询被@PostConstruct标记的方法,然后使用java反射去执行这个方法。

2023-10-25 09:20:47 168

原创 Springboot扩展点系列_ApplicationContextAwareProcessor

ApplicationContextAwareProcessor的注册时机,即准备BeanFactory的时候,注册的入口在AbstractApplicationContext#refresh----->AbstractApplicationContext#prepareBeanFactory方法中。1、ApplicationContextAwareProcessor实现BeanPostProcessor接口,是Spring扩展点之BeanPostProcessor的内部经典实现。

2023-10-25 09:18:22 44

原创 Springboot扩展点系列_SmartInstantiationAwareBeanPostProcessor

如果预测一个错误的Class,那么程序就会报错了(举个例子:如果形参beanClass是Student.class,返回时改成了Teacher.class,报错是毫无疑问的;这一点我没有太明白,有知道的小伙伴告诉我一下哈);(感觉这个扩展点意义不大,实际上构造器分为两类:无参构造方法,有参数构造方法,无非有参数的构造方法参数至少一个以上,用哪种构造器来构造Bean我感觉区别不大,打个比方:用普通碗吃饭与用金碗吃饭,对一些人来说可能是有区别的,对我来说,吃饱就好了,什么碗我不在乎,哈哈,小伙们你觉得呢?

2023-10-24 08:57:13 86

原创 Springboot扩展点系列_InstantiationAwareBeanPostProcessor

最后一步内容很长,不过很简单,即按第二步分成的三类,依次注册,具体的顺序是:1:实现PriorityOrdered接口BeanPostProcessor接口的实现类、2:实现实现Ordered接口BeanPostProcessor接口的实现类、3:其他的BeanPostProcessor接口的实现类,其中MyInstantiationAwareBeanPostProcessor属于第三类;(lambda表达式的应用在Spirng的源码中应用很广泛,所以对这块不太熟悉的小伙伴可以着重研究一下)

2023-10-24 08:53:27 279

原创 Springboot扩展点系列_BeanPostProcessor

​ 在程序中我们可以自定义注解并标到相应的类上,当个类注册到Spring容器中,并实例化完成后,希望触发自定义注解对应的一些其他操作的时候,就可以通过BeanPostProcessor来实现。

2023-10-23 16:42:48 405

空空如也

空空如也

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

TA关注的人

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