责任链模式
责任链模式1. 什么是责任链责任链设计模式是一种行为型设计模式,其主要目的是解耦请求发送者和请求接收者,让多个对象都有机会处理请求,从而避免请求发送者和接收者之间的紧耦合。
责任链模式的核心是一个链式结构,链中每个节点代表一个处理者对象,请求先经过第一个节点处理,如果该节点能够处理请求,则直接返回处理结果;否则,请求继续往下一个节点传递,直到找到能够处理该请求的节点为止。整个过程类似于流水线上的多个工作站,每个工作站负责一项工作,如果自己处理不了,就将工作交给下一个工作站,直到整个工作完成。
在责任链模式中,每个处理者对象都有一个指向下一个处理者对象的引用,这样就形成了一个处理者链。请求发送者只需要将请求发送给第一个节点即可,而不用关心请求会被哪个处理者对象处理。由于每个处理者对象都有机会处理请求,因此责任链模式可以实现请求的动态分配。
2. 优缺点责任链模式的优点在于,它可以动态地添加、删除和调整处理者对象,从而灵活地构建处理链。同时,它也避免了请求发送者和接收者之间的紧耦合,增强了系统的灵活性和可扩展性。
不过,责任链模式也有一定的缺点,例如如果处理链过长或者处理时间过长,可能会对 ...
策略模式
日常 Coding 过程中,设计模式三板斧:模版、构建者、策略,今天来说下第三板斧 策略设计模式。
策略模式还是比较简单并且使用较多的,平常我们多运用策略模式用来消除 if-else、switch 等多重判断的代码,消除 if-else、switch 多重判断 可以有效应对代码的复杂性。
如果分支判断会不断变化(增、删、改),那么可以使用别的技巧让其满足开闭原则,提高代码的扩展性 (策略模式场景主要负责解耦,开闭原则需要额外支持)。
下文中会详细列举如何使用设计模式做个 Demo 、模式的真实场景以及策略模式的好处。
什么是策略模式策略模式在 GoF 的《设计模式》一书中,是这样定义的:
Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.
定义一组算法类,将每个算法分别封装起来,让它们可以互相替换。策略模式使这些算法在客户端调用 ...
Integer
IntegerInteger.valueOf()源码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 @IntrinsicCandidate public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }//缓存-128-127区间的数值private static class IntegerCache { static final int low = -128; static final int high; static final ...
分层结构
体系结构&参考模型分层结构为什么要分层
发送通信的计算机必须要将数据通信的通路进行激活
要告诉网络如何识别目的主机
发送通信的计算机要查明目的主机是否开机,并且与网络连接正常
发起通信的计算机要弄清楚,对方计算机中文件管理程序是否已经做好准备工作
确保差错和意外可以解决
怎么分层
各层之间相互独立,每层只实现一种相对独立的功能
各层之间界面自然清晰,易于理解,相互交流尽可能少
结构上可分割开。每层都采用最适合的技术来实现。
保持下层对上层的独立性,上层单项使用下层提供的服务
整个分层结构能够促进标准化工作
对等实体之间才有协议
认识分层机构
实体:第n层中的活动元素称为n层实体。同一层的实体叫做对等实体
协议:为进行网络中的对等实体数据交换而建立的规则、标准或约定称为网络协议。(水平)
接口(访问服务点SAP):上层使用下层服务的入口。
服务:下层为相邻上层提供的功能调用(垂直)。
SDU服务数据单元:为用户所要求的功能而传送的数据
PCI协议控制信息:控制协议操作的信息。
PDU协议数据单元:对等层次传送的数据单元。
概念总结
网络体系结构是从功能上描述叫算计网络结构
...
Spring容器
容器的实现Spring的IoC容器就是IoC思想的一个落地的产品实现。IoC容器中管理的组件也叫bean。创建bean之前,首先需要创建IoC容器。Spring提供了IoC容器的两种实现方式:
这是IoC容器的基本实现,是Spring内部使用的接口。面向Spring本身,不提供给开发人员使用
ApplicationContext
BeanFactory的子接口,提供了更多高级特性。面向Spring的使用者,几乎所有场合都使用ApplicationContext而不是底层的BeanFactory
ApplicationContext的实现主要类
BeanFactory使用BeanFactory
1234567891011public class DiTest { public static void main(String[] args) { DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); XmlBeanDefinition ...
对象的实例化
对象的实例化、内存布局、访问定位对象的实例化创建对象的方式
new
最常见的方式
变形1:xxx的静态方法
变形2:xxxBuilder/xxxFactory的静态方法
Class的newInstance():反射的方式,只能调用空参的构造器,权限必须是public
Constructor的newInstance(xxx):反射的方法,可以调用空参、带参的构造器,权限没有要求
使用clone():不调用任何构造器,当前类需要实现Cloneable接口,实现clone()
使用反序列化:从文件、从网络中获取一个对象的二进制流
第三方库
创建对象的步骤
判断对象对应的类是否加载、链接、初始化
虚拟机遇到一条new指令,首先去检查这个指令的参数能否在Metaspace的常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化。(即判断类元信息是否存在)。如果没有,那么在双亲委派模式下,使用当前类加载器以ClassLoader+包名+类名为Key进行查找对应的.class文件,如果没有找到文件,则抛出ClassNotFound异常,如果没有找到 ...
SPI机制
简述全程Service Provide Interface,是Java中提供的一种服务发现机制
它允许应用程序动态地加载和使用第三方提供的服务实现
而无需在代码中显示引用这些实现类
Java SPI是基于接口编程思想的具体体现,通过服务接口和其实现分离,从而具备更好的可扩展性和可维护性
如何定义一个SPI
定义一个接口
1234package com.wereash.spi;public interface SayService(){ void say();}
提供一个或多个实现了该接口的实现类,作为服务提供者
12345678package com.wereash.spi;public class SayChinese implements SayService{ @Override public void say(){ System.out.println("你好"); }}
配置文件。在src/main/resource下新建M ...
SpringBoot starter
starter组件是SpringBoot四大核心功能特征之一
除此之外,还有
自动装配
Actuator监控
目的是为了让开发者在开发Spring生态应用时,只需要关注业务逻辑,减少对配置和外部环境的依赖
Starter组件核心功能:
以功能为维度,来维护对应jar包的版本依赖,那么开发者就不需要去关心例如:版本冲突这些容易出错的细节
Starter组件会把对应功能的所有的jar包依赖全部导进来
Starter内部集成了自动装配机制,程序依赖对应的Starter组件之后,会自动集成到Spring生态里面,并且对于相关bean的管理也是基于自动装配实现的
组件对应功能所需要维护的外部化配置,会自动集成在Spring Boot里面,我们只需要在application.properties进行维护配置
官方维护的starter组件:spring-boot-starter-xxx
第三方维护的starter:xxx-spring-boot-starter
wait与notify
wait与notify为什么要放在synchronized中wait和notify是用来实现多个线程之间的一个协调
wait表示让线程进入阻塞状态
notify表示让阻塞线程唤醒
wait和notify是成对出现的,如果一个线程被wait方法阻塞了,那么必然需要另外一个线程通过notify方法进行唤醒,从而实现多个线程之间的通信
在多线程中,要实现多个线程之间的通信,除了管道流之外,只能通过共享变量的方法来实现,也就是说线程t1修改线程变量s,线程t2获得修改后的共享变量s的值,从而去完成线程之间的通信,但是多线程具有并行执行的特性,就是说在同一个时刻,多线程可以通知来操作共享变量。
那么线程t2就必须直到t1已经修改了共享变量s,否则就要进行等待,t1在修改之后,必须要将处在等待的线程t2唤醒
这个时候就需要一个静态条件,去控制线程什么时候条件等待,而什么时候条件唤醒
而synchronized同步关键字就可以实现这样一个互斥的条件
也就是在通过共享变量来实现多线程通信的场景下,参与通信的线程必须要去竞争到这个共享变量的一个锁资源,才能够对共享变量进行修改,修改完之后释放锁,其他 ...
Java常用函数
Java常用函数Math类中
ceil() 方法
cell()方法可以对一个数进行向上取整
double ceil(double d)
double ceil(float f)
pow
a^b次方
Math.pow(double a,double b)
Scanner类中









