- 博客(30)
- 收藏
- 关注

原创 软件架构师设计的七大原则
软件架构师设计的七大原则一、开闭原则开闭原则是指一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。所谓开闭,也真是对扩展和修改两个行为的一个原则。强调的是用抽象架构框架,用实现扩展细节。可以提高软件系统的可复用性及可维护性。是面向对象设计中最基础的设计原则。目的:提高复用性和维护性例1:我们版本更新,我尽可能不修改元代码,但是可以增加新功能二、依赖倒置原则依赖倒置原则是指设计代码时,高层模块不应该依赖底层模块,二者都应该依赖器抽象。抽象不应该依赖细节;细节应该依赖抽象。目的:减少类与类之
2020-08-23 12:26:35
230
原创 装饰模式
装饰模式一、定义装饰模式是指在不改变原有对象的基础之上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能),属于结构型模式。装饰模式在我们生活中应用比较多如给煎饼加鸡蛋;给蛋糕加上一些水果;给房子装修等,为对象扩展一些额外的职责。和静态代理最大的区别就是职责不同,静态代理不一定要满足is-a的关系,静态代理会做功能增强,同一个职责变得不一样,装饰器更多考虑是扩展二、适用场景1.用于扩展一个类的功能或给一个类添加附加职责2.动态的给一个对象添加功能,这些功能可以在动态的撤销
2020-08-31 20:21:23
191
原创 委派模式和策略模式
一、委派模式1.1、定义委派模式不属于GOF23中设计模式中。委派模式的基本作用就是负责任务的调用和分配任务,何代理模式很像,可以看做是一种特殊情况下的静态代理的全权代理,但是代理模式注重过程,二委派模式注重结果。spring中DispatcherServlet其实就是委派模式。1.2、实例老板boos给项目经理leader下达任务,项目经理会根据实际情况给每个员工派发任务,待员工把工资任务完成之后,再由项目经理汇报工资进度和结果给老板。Iemployee员工接口/** * <p>
2020-08-31 17:45:01
313
原创 代理模式
代理模式一、概念代理模式是指为其他对象提供一种代理,以控制对这个对象的访问。代理对象在客户端和目标对象之间起到中介作用,代理模式属于结构型设计模式。使用代理模式主要有两个目的:一保护目标对象,二增强目标对象。二、JDK动态代理代理的目标接口,相亲public interface Person { public void findLove();}代理目标实现,要相亲的人public class JDKCustomer implements Person { @Overri
2020-08-31 13:25:35
179
原创 单例模式
单例模式饿汉式单例public class HungrySingleton { private static final HungrySingleton HUNGRY_SINGLETON = new HungrySingleton(); private HungrySingleton(){} public static HungrySingleton getInstance(){ return HUNGRY_SINGLETON; }}publi
2020-08-26 23:17:43
176
原创 设计模式-工厂模式
设计模式-工厂模式spring中的BeanFactory就是工厂模式一、简单工厂模式简单工厂模式是指一个工厂对象决定创建出哪一种产品类的实例。实现一个类,类里面有一个方法,更加传入的参数,创建对象。客户端只需要传入工厂类参数,对如何创建类不关心。下图就是一个简单工厂的实例Calendar.getInstance就是一个简单工厂模式缺点:工厂类的职责相对过重,不易于扩展过于复杂的产品结构。二、工厂方法模式工厂方法模式是指定义一个创建对象的接口,但让实现这个接口的类觉定实例化哪个类,工厂方法
2020-08-23 12:57:30
132
原创 HashMap源码分析(容量与初始化)
一、成员属性1、transient HashMapInit.Node<K,V>[] table;最大integer.max,桶数组实际上threshold的值就是table下次扩容的值HashMap.TreeNode的父类继承了HashMap.Node默认为容量为16,下一次扩容容量=threshold=table.size*loadFactornode成员变量...
2020-04-10 20:34:57
318
原创 ArrayList源码分析(容量与初始化)
当ArrayList 使用无参构造时,默认大小为10 ,也就是说在第一次add 的时候,分配为10 的容量,后续的每次扩容都会调用Array. copyOf 方法,创建新数组再复制。可以想象, 假如需要将1000个元素放置在ArrayList 中,采用默认构造方法,则需要被动扩容13 次才可以完成存储。反之,如果在初始化时便指定了容量new ArrayList(l 000), 那么在初始化Arra...
2020-04-10 20:32:08
277
原创 JWT讲解
1、导入jar包<dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.4.0</version></dependency>2、demo,使用时自己发...
2020-01-07 19:15:56
160
转载 MyBatis Generator中文文档
MyBatis Generator中文文档MyBatis Generator中文文档地址:http://mbg.cndocs.ml/该中文文档由于尽可能和原文内容一致,所以有些地方如果不熟悉,看中文版的文档的也会有一定的障碍,所以本章根据该中文文档以及实际应用,使用通俗的语言来讲解详细的配置。本文中所有节点的链接都是对应的中文文档地址,可以点击查看详细信息。注:本文后面提到的MB...
2020-01-07 13:48:34
444
转载 分布式之消息队列
为什么写这篇文章?博主有两位朋友分别是小A和小B:小A,工作于传统软件行业(某社保局的软件外包公司),每天工作内容就是和产品聊聊需求,改改业务逻辑。再不然就是和运营聊聊天,写几个SQL,生成下报表。又或者接到客服的通知,某某功能故障了,改改数据,然后下班部署上线。每天过的都是这种生活,技术零成长。小B,工作于某国企,虽然能接触到一些中间件技术。然而,他只会订阅/发布消息。通俗点说,就是调调A...
2020-01-06 16:45:30
175
1
原创 @Cacheable 缓存 @CachePut:缓存更新 @CacheEvict:缓存删除
@Cacheable 缓存说明:在支持Spring Cache的环境下,对于使用@Cacheable标注的方法,Spring在每次执行前都会检查Cache中是否存在相同key的缓存元素,如果存在就不再执行该方法,而是直接从缓存中获取结果进行返回,否则才会执行并将返回结果存入指定的缓存中。// @since 3.1 可以标注在方法上、类上 下同@Target({ElementType.ME...
2020-01-05 16:17:30
14422
转载 @Cacheable key的使用
key属性是用来指定Spring缓存方法的返回结果时对应的key的。该属性支持SpringEL表达式。当我们没有指定该属性时,Spring将使用默认策略生成key。我们这里先来看看自定义策略,至于默认策略会在后文单独介绍。 自定义策略是指我们可以通过Spring的EL表达式来指定我们的key。这里的EL表达式可以使用方法参数及它们对应的属性。使用方法参数时我们可以直接使用“#参数名...
2020-01-05 15:56:55
16069
原创 Springboot整合swagger2
1、pom<!-- 引入 swagger2--><dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>${springfox.version}...
2020-01-05 13:50:56
155
原创 SpringBoot整合Redis jedis
1、maven引入 redis.clients jedis org.springframework.boot spring-boot-starter-data-redis2、yml配置spring: redis: timeout: 1000ms # 连接超时时间(毫秒) jedis: pool: max-wa...
2020-01-04 18:20:03
354
原创 mybatis generator 反向工程 参数解耦式
1、在pom文件中添加插件plugin。configurationFile是xml文件的路径,可以灵活配置<plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId>...
2020-01-04 14:05:53
153
转载 mybatis generator 覆盖xml文件
mybatis generator 覆盖xml文件 mybatisgenerator默认采用追加方式生成,所以我们如果要重新生成代码的时候那么要先删除原来的文件。解决办法:1:创建一个自定义补丁类。OverwriteXmlPlugin.javapackage com.my.common.generator.myplugins;import java.util.List...
2020-01-03 20:28:47
907
原创 计数排序
public static void main(String[] args) { int[] array={49,38,65,97,76,13,27,49,78,34,12,64,1}; int[] newArray = myCountSort(array); System.out.println("排序之后:"); for(int i=0;i<newArr...
2020-01-02 10:35:32
111
原创 归并排序
public static void main(String[] args) { int[] array={49,38,65,97,76,13,27,49,78,34,12,64,1}; int[] newArray = myMergeSort(array, 0, array.length - 1); System.out.println("排序之后:"); fo...
2020-01-02 10:34:45
84
原创 冒泡排序
/** * 冒泡排序 * 冒泡排序的思想就是每一趟排序都把大的元素往上浮, * 具体是这样:从当前待排序列第一个开始遍历,指针从第一个开始,如果当前元素大于下一个,那么二者交换, * 指针往后走,当走到待排序列末尾时,最大的一定被放到了最后(像冒泡泡一样上去了),然后缩小待排子序列(把最后一个从当前待排序序列删去), * 如此循环直到当前待排子序列只有一个元素。 * */publ...
2020-01-02 10:32:37
87
原创 堆排序详解
具体过程建立小堆顶或大堆顶函数,函数从最后一个非叶子节点开始,若子节点比当前节点的值小或者大则交换,并在交换以后,将当前坐标的交换到的位置作为节点选出其子节点中的最小或者最大值替换当前的值()(后续的步骤是非必要的,目的是为了尽量让大值或者小值沉下去)。堆排序,就是利用堆快速的选出最小值(小堆顶)或最大值(大堆顶),并保证所有的节点值都小于或大于其子节点。每次选出的堆顶的值,肯定是最小或最大的值,放在数组尾部(下次不参与堆),实际上来说就是通过小堆顶或者大堆顶加快选出最小最大值。
2020-01-02 10:32:12
208
1
原创 简单选择排序
/** * 选择排序(Selection sort)是一种简单直观的排序算法。 * 它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置, * 然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。 * 以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。 * @param args */publi...
2020-01-02 10:31:35
1162
原创 希尔排序
public static void myShellSort(int[] array){ int gap=array.length/2;//希尔排序的间距,如果间距为2,那么0,2,4,6,8,10...元素就认为是一个数组,1,3,5,7,9..也认为是一个新数组。 // 就是用来切分数组的,为什么这样做去百度百科看下吧,人家讲的比我好 do{ for(...
2020-01-02 10:30:33
120
原创 直接插入排序
其实这个没什么可讲的,就像前面说的: 如果有一个长度为n的有序数组a,现在又一个元素要插入到数组a,并使数组a依然是有序的,应该怎么做。先说那些是必要做的事情,我们必须找到要插入的元素应该处于的下标,然后把这个下标及下标后面的元素都整体向后移。下面就这两件事请,说下程序应该怎么写。注意上面的假设: 如果有一个长度为n的有序数组a,现在又一个元素要插入到数组a,并使数组a依然是有序的,应该怎么做...
2020-01-02 10:10:12
226
1
原创 经典排序算法
这里主要讲的是主要讲的是内排序,可用于面试,装逼。开阔下视野,对编程能力和技巧提升还是很大的。先阶段先不分析时间复杂度和空间复杂度,我也讲不太明白,稳定性也不太懂。本篇博客就是先讲一下概念,后面会仔细讲每一种排序算法的。听说东西可以打赏钱,还没体验过,那个啥..,你懂得比较排序:大量的比较,没什么好说的插入排序:主要采用插入的方式实现。算法起始于这样一种思路,如果有一个长度...
2019-12-31 16:33:53
260
1
转载 守护线程及守护进程在java中的用法
所谓守护线程是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因 此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。守护线程和用户线程的没啥本质的区别:唯一的不同之处就在于虚拟机的离开:如果用户线程已经全部退出运行了,只剩下守护线程...
2019-04-06 08:21:06
525
原创 java中的Thread.join()
Thread.join();其实就是主线程调用子线程对象的一个方法,然后主线程一直wait到子线程死亡才从方法中出来
2019-04-06 08:14:23
216
原创 elasticsearch 中的_all、_source和index、store
elasticsearch 中的_all、_source和index、store一、_all二、_source四、store一、_all_all字段默认是关闭的,如果要开启_all字段,索引增大是不言而喻的。_all字段开启适用于不指定搜索某一个字段,根据关键词,搜索整个文档内容二、_source“includes”: [“path1.", "path2.”],包含那些字段,当"enabl...
2019-04-06 08:10:29
1289
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人