- 博客(72)
- 收藏
- 关注
原创 VO, DTO, DO, PO四胞胎傻傻分不清楚?那快来看这篇文章!
VO(View Object)、DTO(Data Transfer Object)、DO(Domain Object)、 PO(Persistent Object)四兄弟的概念、区别、应用场景
2022-11-28 17:36:34
784
原创 Kafka之生产者
1.简介从编程的角度而言,生产者就是负责向Kafka发送消息的应用程序。在Kafka的历史变迁中,一共有两个大版本的生产者客户端:第一个是于Kafka开源之初使用Scala语言编写的客户端,我们可以称之为旧生产者客户端(Old Producer)或Scala版生产者客户端;第二个是从Kafka0.9x 版本开始推出的使用Java语言编写的客户端,我们可以称之为新生产者客户端(New Producer)或Java版生产者客户端,它弥补了旧版客户端中存在的诸多设计缺陷。虽然Kafka是用Java/Scala语
2021-08-18 18:33:43
841
原创 Kafka之初识Kafka
1.简介Kafka起初是由LinkedIn公司采用Scala语言开发的一个多分区、多副本且基于ZooKeeper协调的分布式消息系统,现已被捐献给Apache基金会。目前Kafka已经定位为一个分布式流式处理平台,它以高吞吐、可持久化、可水平扩展、支持流数据处理等多种特性而被广泛使用。目前越来越多的开源分布式处理系统如Cloudera、Storm、Spark、Flink等都支持与Kafka集成。Kafka之所以受到越来越多的青睐,与它“扮演”的三大角色是分不开的。消息系统:Kafka和传统的消息系统
2021-08-12 11:53:42
427
原创 Kafka简介
1.简介1.1.概述Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日志、消息服务等等,Linkedin于2020年贡献给了Apache基金会并成为顶级开源项目。主要应用场景是:日志手机系统和消息系统。Kafka主要设计目标如下:以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能。高吞吐率。即使在非常廉价的商
2021-08-09 20:12:45
421
原创 设计模式总结
23种设计模式总结 分类 设计模式 简述 一句话归纳 目的 生活案例 开发场景 主要角色 源码应用 创建型设计模式(创建对象) 工厂模式 Factory 不同条件下创建不同实例 产品标准化 封装产品细节 实体工厂 版本切换 工厂、产品 Calendar、Connection 单例模式(Singl
2021-07-29 21:51:41
154
原创 解析器模式详解
1.简介在软件开发中,会遇到有些问题多次重复出现,而且有一定的相似性和规律性。如果将它们归纳成一种简单的语言,那么这些问题实例将是改语言的一些句子,这样就可以用“编译原理”中的解释器模式来实现了。虽然使用解释器模式的实例不是很多,但对于满足以上特点,且对运行效率不是很高的应用实例,如果用解释器模式来实现,其效果是非常好的。2.定义解释器(Interpreter)模式的定义:给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解释器来解释语言中的句子。也就是说,用编译语言的方式来分析应用中的实例
2021-07-23 21:11:55
848
原创 备忘录模式详解
1.简介每个人都有犯错的时候,都希望有种“后悔药”能弥补自己的过失,让自己重新开始,但现实是残酷的。在计算机应用中,客户同样会常常犯错误,能否提供“后悔药”给他们呢?当然是可以的,而且是有必要的。这个功能由“备忘录模式”来实现。其实很多应用软件都提供了这项功能,如Word、记事本、Photoshop、Eclipse等软件在编辑时按Ctrl+Z组合键时能撤销当前操作,使文档恢复到之前的状态;还有在IE中的后退键、数据库事务管理中的回滚操作、玩游戏时的中间结果存档功能、数据库与操作系统的备份操作、棋类游戏中
2021-07-23 11:02:40
434
2
原创 访问者模式详解
1.简介在现实生活中,有些集合对象存在多种不同的元素,且每种元素也存在多种不同的访问者和处理方式。例如,公园中存在多个景点,也存在多个游客,不同的游客对同一个景点的评价可能不同;医院医生开的处方单中包含多种药元素,查看它的划价员和药房工作人员对它的处理方式也不同,划价员根据处方单上面的药品和数量进行划分,药房工作人员根据处方单的内容进行抓药。这样的例子还有很多,例如,电影或电视剧中的人物角色,不同的观众对他们的评价也不同;还有顾客在商场购物时放在“购物车”中的商品,顾客主要关心所选商品的性价比,而收银员
2021-07-21 20:41:23
1399
原创 迭代器模式详解
1.简介在现实生活以及程序设计中,经常要访问一个聚合对象中的各个元素,如“数据结构”中的链表遍历,通常的做法是将链表的创建和遍历都放在同一个类中,但这种方式不利于程序的扩展,如果要更换遍历方式就必须修改程序源代码,这违背了“开闭原则”。既然将遍历方法封装在聚合类中不可取,那么聚合类中不提供遍历方法,将遍历方法由用户自己实现是否可行呢?答案是同样不可取,因为这种方式会存在两个缺点:暴露了聚合类的内部表示,使其数据不安全;增加客户的负担。“迭代器模式”能较好地客服以上缺点,它在客户访问类和聚合类之
2021-07-18 12:40:28
257
原创 中介者模式详解
1.简介在现实生活中,常常会出现好多对象之间存在复杂的交互关系,这种交互关系常常是“网状结构”,它要求每个对象都必须知道它需要交互的对象。例如,每个人必须记住他(她)所有朋友的电话;而且,朋友中如果有人的电话修改了,他(她)必须让其他所有的朋友一起修改,这叫作“牵一发而动全身”,非常复杂。如果把这种“网状结构”改为“星形结构”的话,将大大降低他们之间的“耦合性”,这时只要找一个“中介者”就可以了。如前面所说的“每个人必须记住所有朋友的电话”的问题,只要在网上建立一个每个朋友都可以访问的“通信录”就解决了
2021-07-15 17:55:02
235
1
原创 观察者模式详解
1.简介在现实世界中,许多对象并不是独立存在的,其中一个对象的行为发生改变可能会导致一个或者多个其他对象的行为也发生改变。例如,某种商品的物价上涨时会导致部分商家高兴,而消费者伤心;还有,当我们开车到交叉路口时,遇到红灯会停,遇到绿灯会行。这样的例子还有很多,例如,股票价格与股民、微信公众号和微信用户、气象局的天气预报与听众、小偷与警察等。在软件世界也是这样,例如,Excel中的数据与折线图、饼状图、柱状图之间的关系;MVC模式中的模板与视图的关系;事件模型中的事件源与事件处理者。所有这些,如果用观察者
2021-07-13 20:36:50
440
1
原创 状态模式详解
1.简介在软件开发过程中,应用程序中的部分对象可能会根据不同的情况作出不同的行为,我们把这些对象称为有状态的对象,而把影响对象行为的一个或多个动态变化的属性称为状态。当有状态的对象与外部事件产生互动时,其内部状态就会发生改变,从而使其行为也发生改变。如人都有高兴和伤心的时候,不同的情绪有不同的行为,当然外界也会影响其情绪变化。对这种有状态的对象编程,传统的解决方案是:将这些所有可能发生的情况全都考虑到,然后使用if/else或switch-case语句来做状态判断,在进行不同情况的处理。但是显然这种做法
2021-07-09 19:42:22
1505
原创 责任链模式详解
1.简介在现实生活中,一个事件需要经过多个对象处理是很常见的场景。例如,采购审批流程、请假流程等。公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同,员工必须根据需要请假的天数去找不同的领导签名,也就是说员工必须记住每个领导的姓名、电话和地址等信息,这无疑增加了难度。在计算机软硬件中也有相关例子,如总线网中数据报传送,每台计算机根据目标地址是否和自己的地址相同来决定是否接收,还有异常处理中,处理程序根据异常的类型决定自己是否处理该异常;还有Struts2的拦截器、JS
2021-07-08 13:38:50
350
2
原创 命令模式详解
1.简介在软件开发系统中,“方法的请求者”和“方法的实现者”之间经常存在紧密的耦合关系,这不利于软件功能的扩展和维护。例如,想对方法进行“撤销、重做、记录”等处理都很不方便。因此,“如何将方法的请求者与实现者解耦?”变得很重要,命令模式就能很好地解决这个问题。在现实生活中,命令模式的例子也很多。比如看电视时,我们只需要轻轻一按遥控器就能完成频道的切换,这就是命令模式,将换台请求和换台处理完全解耦了。电视遥控器(命令发送者)通过按钮(具体命令)来遥控电视机(命令接收者)。再比如,我们去餐厅吃饭,菜单不是
2021-07-06 18:11:06
220
2
原创 策略模式详解
1.简介在现实生活中长长遇到实现某种目标存在多种策略可供选择的情况,例如,出行旅游可以乘坐飞机、乘坐火车、骑自行车或自己开私家车等,超时促销可以采用打折、送商品、送积分等方法。在软件开发中也常常遇到类似的情况,当实现某一个功能存在多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能,如数据排序策略有冒泡排序、选择排序、插入排序、二叉树排序等。如果使用多重条件转移语句实现(即硬编码),不但使条件语句变得很复杂,而且增加。删除或更换算法要修改原代码,不易维护,违背开闭原则。如
2021-07-04 14:12:12
4712
2
原创 模板方法模式详解
1.简介在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关。例如:去银行办理业务一般要经过以下4个流程:区号、排队、办理具体业务、对银行工作人员进行评分等。其中取号、排队和对银行工作人员进行评分的业务是对每个客户都是一样的,可以在父类中实现,但是办理具体业务却因人而异,它可能是存款、取款或者转账等,可以延迟到子类中实现。这样的例子在生活中还有很多,例如:一个人每天会起床、
2021-07-01 21:33:25
350
1
原创 组合模式详解
1.简介在现实生活中,存在很多“部分-整体”的关系,例如:大学中的部门与学园、总公司的部门与分公司、学习用品中的书与书包、生活用品中的衣服与衣柜等。在软件开发中也是这样,例如文件系统中文件与文件夹等。对于这些简单对象与符合对象的处理,如果用组合模式来实现会很方便。2.定义组合(Composite Pattern)模式的定义:有时又叫做整体-部分(Part-Whole)模式,它是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系,使用户对单个对象和组合对象具有一致的访问性,属于结构型设计
2021-06-29 21:35:06
483
1
原创 享元模式详解
1.简介在面向对象程序设计过程汇总,有时会面临要创建大量相同或相似对象实例的问题。创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈。例如:围棋和五子棋中的黑白棋子,图像中的坐标点或颜色,局域网中的路由器、交换机和集线器,教室里的桌子和凳子等。这些对象有很多相似的地方,如果能把他们相同的部分提取出来共享,则能节省大量的系统资源,这就是享元模式的产生背景。2.定义享元(Flyweight)模式的定义:运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要
2021-06-27 15:43:28
281
2
原创 外观模式详解
1.简介在现实生活中,长长存在办事较复杂的例子,如办房产证或注册一家公司,有时要同多个部门联系,这是要有一个综合部门能解决一切手续问题就好了。软件设计也是这样,当一个系统的功能越来越强,子系统会越来越多,客户端对系统的访问也变得越来越复杂。这时如果系统内部发生改变,客户端也要跟着改变,这违背了“开闭原则”,也违背了“迪米特法则”,所以有必要为多个子系统提供一个统一的接口,从而降低系统的耦合度,这就是外观模式的目标2.定义外观(Facade)模式又叫作门面模式,是一种通过多个复杂的子系统提供一个一致的
2021-06-24 21:06:18
248
2
原创 装饰器模式详解
1.简介上班族大多都有睡懒觉的习惯,每天早上上班时间都很紧张,于是很多人为了多睡一会,就会用方便的方式解决早餐问题。有些人早餐可能会吃煎饼,煎饼中可以加鸡蛋,也可以加香肠,但是不管怎么“加码”,都还是一个煎饼。在现实生活中,常常需要对现有产品增加新的功能或美化其外观,如房子装修、相片加相框等,都是装饰器模式。在软件开发过程中,有时想用一些现存的组件。这些组件可能只是完成了一些核心功能。但在不改变其结构的情况下,可以动态地扩展其功能。所有这些都可以采用装饰器模式来实现。2.定义装饰器(Decorato
2021-06-23 19:51:37
929
1
原创 桥接模式详解
1.简介在显示生活中,某些类具有两个或多个维度的变化,如图形既可按形状分,又可按颜色分。如何设计类似于Photoshop这样的软件,能画不同形状和不同颜色的图形呢?如果用继承方式,m种形状和n中颜色的图形就有m*n种,不但对应的子类很多,而且扩展困难。当然,这样的例子还有很多,如不同颜色和字体的文字、不同品牌和功率的汽车、不同性别和职业的男女、支持不同平台和不同文件格式的媒体播放器等。如果用桥接模式就能很好地解决这些问题。2.定义桥接模式(Bridge)的定义如下:将抽象与现实分离,使他们可以独立变
2021-06-22 15:15:01
721
原创 适配器模式详解
1.简介在现实生活中,经常出现两个对象因接口不兼容而不能在一起工作的实例,这时需要第三者进行适配。例如:讲中文的人和讲英文的人对话时需要一个翻译,用直流电的笔记本电脑接交流电源时需要一个电源适配器,用计算机访问照相机的SD内存卡时需要一个读卡器等。在软件设计中也可能出现:需要开发的具有某种业务功能的组件在现有的组件库中已经存在,但是他们与当前系统的接口规范不兼容,如果重新开发这些组件成本又很高,这时用适配器模式就能很好的解决这些问题。2.定义适配器模式(Adapter)的定义如下:将一个类的接口转换
2021-06-20 17:56:54
1058
原创 代理模式详解
1.简介在某些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象。例如:购买火车票不一定要去火车站买,可以通过12306网站或者去火车票代售点买。又如找女朋友、找保姆、找工作等都可以通过找中介完成。在软件设计中,使用代理模式的例子也很多,例如:要访问的远程对象比较大,其下载需要花很多时间。还有因为安全原因需要屏蔽客户端直接访问真实对象,如某单位的内部数据库等。2.定义代理模式的定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,
2021-06-18 22:21:32
323
原创 Java RSA、AES加密样例代码
RSA加解密:@Log4jpublic class RSAMorliaCipher implements IMorliaCipher{ private static final String RSA_PUB_KEY_STRING = "publickey"; private static final String RSA_PRI_KEY_STRING = "privatekey"; private static Cipher pubCipher = null; private s
2021-05-20 12:17:28
188
原创 设计模式之建造者模式
简介在软件开发过程中有时需要创建一个复杂的对象,这个负责对象通常由多个子部件按一定的步骤组合而成的。例如,计算机是由CPU、主板、内存、硬盘、显卡、机箱、显示器、键盘、鼠标等部件组装而成的,采购员不可能自己去组装计算机,而是将计算机的配置要求告诉给计算机销售公司,计算机销售公司安排技术人员去组装计算机,然后再交给要买计算机的采购员。生活中这样的例子很多,如游戏中的不同角色,其性别、个性、能力、脸型、服装、发型等特性都有所差异;还有汽车中的方向盘、发动机、车架、轮胎等部件也多种多样;每封电子邮件的发送人、
2021-05-20 12:06:42
169
2
原创 设计模式之工厂模式(简单工厂、工厂方法、抽象工厂)
定义简单工厂模式(Simple Factory Pattern):由一个工厂对象决定创建哪一种产品类的实例。简单工厂模式是工厂模式的小弟,它不属于GOF23中设计模式之一。但是平常应用也比较频繁。在简单工厂模式中创建实例的方法通常为静态(static)方法,因此简单工厂模式(Simple Factory Pattern)又叫静态工厂方法模式(static Factory Method Pattern)。优点工厂类包含必要的逻辑判断,可以决定在什么时候创建哪一个产品的实例。客户端可以免除直接创建产
2021-04-29 11:20:16
303
2
原创 设计模式之原型模式(附带JDK,Spring源码样例)
定义原型模式(Prototype Pattern):使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是一种对象创建型模式。不需要知道任何创建的细节, 不调用构造函数。例如:Windows操作系统的安装通常较耗时,如果复制就快了很多。应用场景对象之间相同或相似,即只是个别的几个属性不同的时候。创建对象成本较大,例如初始化时间长,占用CPU太多,或者占用网络资源太多等,需要优化资源。创建一个对象需要繁琐的数据准备或访问权限等,需要提高性能或者提高安全性。系统中大量使用该
2021-04-22 19:20:44
447
原创 设计模式之单例模式(JDK,Spring源码样例)
定义单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。单例模式是一种对象创建型模式。在Java中,应用程序的运行环境、应用程序的配置对象、多线程的线程池、数据库的连接池、网站的计数器、程序中的缓存等常常被设计成单例。单例模式有3个特点:单例类只有一个实例对象;该单例对象必须由单例类自行创建;单例类对外提供一个访问该单例的全局访问点。优点在内存里只有一个实例,减少了内存开销可以避免对
2021-04-20 20:58:27
682
原创 面向对象设计原则(附带代码样例和JDK中的例子)
1.单一职责(SRP)定义单一职责原则(Single Responsibility Principle)中的职责是指类变化的原因,单一职责原则规定一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分。简单来说:一个类只负责一项职责。优点单一职责原则的核心就是控制类的粒度大小、将对象解耦、提高其内聚性。如果遵循单一职责原则将有以下优点。1.降低类的复杂度。一个类只负责一项职责,其逻辑肯定要比负责多向职责简单的多。2.提高类的可读性。复杂性降低,自然其可读性会提高。3.提高系统的可维护性。可读
2021-04-13 12:19:21
1047
原创 Lombok,可以使用注解减少冗余代码的插件(最全讲解)
1.日志类 private static2.@date 无用信息太多3.@toString 用+连接,性能不太好4.@builder 无法复制,无法通过JSONObject转化为对象,加两个构造器
2021-04-06 10:44:34
2048
1
原创 IDEA提示skipped breakpoint at ... because it happened inside debugger
skipped breakpoint at java.util.concurrent.ConcurrentHashMap:937 because it happened inside debugger
2021-03-30 12:01:40
8954
原创 JDK1.8中的ConcurrentHashMap源码解析
1.底层结构ConcurrentHashMap的底层结构和HashMap是一致的,都是使用的数组+链表+红黑树。2.链表转化为红黑树的场景和原因1.场景在putVal()方法中,链表新增完一个节点的时候,会对链表长度进行判断,如果链表长度大于8(包含当前新增节点),并且数组长度大于等于64,则转化为红黑树,否则扩容。final V putVal(K key, V value, boolean onlyIfAbsent) { if (key == null || value == null
2021-03-29 20:03:35
416
2
原创 通过redis解决重复性请求(幂等性问题,附带样例代码)
1. 幂等性幂等性的含义是一个用户对一个操作发起的一次或多次请求的结果是一致的。下面是2个例子,创建订单和校验订单的时候,一段时间的请求的响应是一致的,并且只创建了一个订单。2.创建订单流程图:样例代码:Redis操作工具类:public class RedissonUtil { private static RedissonUtil redissonUtil = new RedissonUtil(); private static RedissonClient clie
2021-03-25 14:42:24
1572
1
原创 Spring boot接入Redisson相关问题
1. ERR unknown command ‘CLUSTER’. channel:command: (CLUSTER NODES)问题:使用的redis是单例部署,不是集群部署redissonConfig.useClusterServers().addNodeAddress("redis://127.0.0.1:6379");redissonConfig.useClusterServers().setPassword("password");解决方法:将服务器设置从集群改为单例redisson
2021-03-23 19:50:47
2175
原创 Java锁相关的问题总结
1.synchronized加锁的对象有哪些?object对象(new 出来的对象)场景:1.synchronized修饰非静态方法 2.synchronized(object)同步代码块传入的object对象class单例对象场景:1.synchronized修饰静态方法 2.synchronized(class)同步代码块传入的class对象常量池对象场景:synchronized(“123”)同步代码块传入的常量池对象2.synchronized中的锁升级是否可逆?不可逆。sync
2021-03-18 17:10:23
320
原创 Mysql索引的常见问题
1.Mysql索引方面常见问题1.索引的优点和缺点优点:可以大大加快数据的检索速度缺点:时间方面:创建索引和维护索引需要消耗时间空间方面:索引需要占物理空间2.哪些情况下需要创建索引主键自动建立唯一索引频繁作为查询条件的字段多表关联查询中的关联字段排序的字段频繁查找的字段,需要覆盖索引查询中统计或者分组字段3.哪些情况下不需要创建索引表记录太少经常进行增删改查操作的字段where条件里使用频率不高的字段4.创建索引的几种方式创建表时添加索引使用alt
2021-03-17 18:01:44
541
原创 IDEA通过反射查看TreeMap的红黑树
1.根节点所对应的属性先通过TreeMap的源码找到根节点所代表的属性/** * The comparator used to maintain order in this tree map, or * null if it uses the natural ordering of its keys. * * @serial */private final Comparator<? super K> comparator;private transient Entry<
2021-03-16 19:33:41
327
原创 弱引用和软引用的应用场景
1.利用软引用和弱引用解决OOM问题假如有一个应用需要读取大量的本地图片,如果每次读取图片都从硬盘读取,则会严重影响性能,但是如果全部加载到内存中,又可能造成内存溢出,此时使用软引用可以解决这个问题。设计思路:用一个HashMap来保存图片的路径和相应图片对象关联的软引用之间的映射关系,在内存不足时,JVM会自动回收这些缓存图片对象所占用的空间,从而有效地避免了OOM的问题。2.使用软引用构建敏感数据的缓存假如有一个雇员信息查询系统的实例。我们将使用一个Java语言实现的雇员信息查询系统查询缓存在磁
2021-03-16 14:30:52
1692
原创 Java的四种引用和ReferenceQueue以及对象可达性判断
引用和对象每种编程语言都有自己操作内存中元素的的方式,例如在C和C++里是通过指针,而在Java中则是通过"引用"。在Java中一切都被视为了对象,但是我们操作的标识符实际上是对象的一个引用(reference)。//创建一个引用,引用可以独立存在,并不一定需要与一个对象关联String s;通过将这个叫"引用"的标识符指向某个对象,之后便可以通过这个引用来实现操作对象了。String s = new String("abc");System.out.println(s.toString()
2021-03-15 20:10:20
729
原创 IDEA实现OutOfMemoryError堆溢出和StackOverflowError栈溢出
生成一个可运行的类,将IDEA的运行类选择为此类点击编辑结构… 按钮,在虚拟机选项中添加JVM参数,中间空格分隔(这里只用得到-Xmx)。-Xmx30m参数名参数含义-Xmsjvm启动时分配的内存-Xmxjvm运行过程中分配的最大内存-Xss为JVM启动的每个线程分配的内存大小生成超过大小的数组List<Object> argList = new ArrayList<>();for(int i = 0; i <.
2021-03-15 15:10:10
1368
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人