Tom弹架构_社区达人页

个人头像照片
Tom弹架构
已加入开发者社区942

勋章 更多

个人头像照片
专家博主
专家博主
个人头像照片
星级博主
星级博主
个人头像照片
技术博主
技术博主
个人头像照片
初入江湖
初入江湖

成就

已发布192篇文章
12条评论
已回答0个问题
0条评论
已发布0个视频
github地址

我关注的人 更多

技术能力

兴趣领域
  • Spring
  • 分布式
  • 微服务
  • Java架构
  • 设计模式
擅长领域
技术认证

暂时未有相关云产品技术能力~

咕泡科技联合创始人。著有畅销书《Spring 5核心原理与30个类手写实战》、《Netty 4核心原理与手写RPC框架实战》、《设计模式就该这样学》、《Java面试八股文》。一个从美术生转型Java开发的程序员,3年内做到架构师,5年内做到CTO。14年Java从业经验,6年线上教学经验。

暂无精选文章
暂无更多信息

2023年08月

  • 08.31 10:46:18
    发表了文章 2023-08-31 10:46:18

    彻底搞懂访问者模式的静态、动态和伪动态分派

    每到年底,管理层就要开始评定员工一年的工作绩效,员工分为工程师和经理;管理层有CEO和CTO。那么CTO关注工程师的代码量、经理的新产品数量;CEO关注工程师的KPI、经理的KPI及新产品数量。
  • 08.31 10:35:37
    发表了文章 2023-08-31 10:35:37

    微信和QQ这么多群,该如何管理好友关系?

    在现实生活中,中介者的存在是不可缺少的,如果没有了中介者,我们就不能与远方的朋友进行交流。各个同事对象将会相互进行引用,如果每个对象都与多个对象进行交互,则会形成如下图所示的网状结构。
  • 08.31 10:31:12
    发表了文章 2023-08-31 10:31:12

    只要100行代码,实现文本编辑器中的草稿箱功能

    大家都用过网页中的富文本编辑器,编辑器通常都会附带草稿箱、撤销等操作。下面用一段代码来实现一个这样的功能。假设,我们在GPer社区中发布一篇文章,文章编辑的过程需要花很长时间,中间也会不停地撤销、修改,甚至可能要花好几天才能写出一篇精品文章,因此可能会将已经编辑好的内容实时保存到草稿箱。
  • 08.31 10:25:02
    发表了文章 2023-08-31 10:25:02

    使用命令模式重构播放器控制条

    假如我们开发一个播放器,播放器有播放功能、拖动进度条功能、停止播放功能、暂停功能,我们在操作播放器的时候并不是直接调用播放器的方法,而是通过一个控制条去传达指令给播放器内核,具体传达什么指令,会被封装为一个个按钮。那么每个按钮就相当于对一条命令的封装。用控制条实现了用户发送指令与播放器内核接收指令的解耦。下面来看代码,首先创建播放器内核GPlayer类。
  • 08.31 09:57:23
    发表了文章 2023-08-31 09:57:23

    掌握这30个设计模式真实案例,挑战年薪60W不是梦

    Design Patterns: Elements of Reusable Object-Oriented Software(以下简称《设计模式》),一书由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides合著(Addison-Wesley,1995)。这四位作者常被称为“四人组(Gang of Four)”,而这本书也就被称为“四人组(或 GoF)”书。他们首次给我们总结出一套软件开发可以反复使用的经验,帮助我们提高代码的可重用性、系统的可维护性等,解决软件开发中的复杂问题。
  • 08.31 08:56:25
    发表了文章 2023-08-31 08:56:25

    这个无敌设计,可以解析并运算任意数学表达式

    下面用解释器模式来实现一个数学表达式计算器,包含加、减、乘、除运算。 首先定义抽象表达式角色IArithmeticInterpreter接口。
  • 08.31 08:49:48
    发表了文章 2023-08-31 08:49:48

    基于Guava API实现异步通知和事件回调

    当小伙伴们在社区提问时,如果有设置指定用户回答,则对应的用户就会收到邮件通知,这就是观察者模式的一种应用场景。有些小伙伴可能会想到MQ、异步队列等,其实JDK本身就提供这样的API。我们用代码来还原这样一个应用场景,首先创建GPer类。
  • 08.31 08:43:48
    发表了文章 2023-08-31 08:43:48

    手写自定义迭代器,秒懂迭代器底层原理

    迭代器模式的UML类图如下图所示。
  • 08.31 01:01:14
    发表了文章 2023-08-31 01:01:14

    意外发现,原来你不知道自己每天都在用门面模式

    一般的电商平台都是整合众多的子系统聚合到一起形成一个大型的购物平台,一般情况下,有很多现成的功能都不是重新开发的,而是要去对接已有的各个子系统,这些子系统可能涉及积分系统、支付系统、物流系统的接口调用。如果所有的接口调用全部由前端发送网络请求去调用现有接口,一则会增加前端开发人员的难度,二则会增加一些网络请求,影响页面性能。此时就可以发挥门面模式的优势了。将所有现成的接口全部整合到一个类中,由后端提供统一的接口供前端调用,这样前端开发人员就不需要关心各接口的业务关系,只需要把精力集中在页面交互上。我们用代码来模拟一个积分兑换礼品的业务场景。
  • 08.31 00:53:49
    发表了文章 2023-08-31 00:53:49

    手写数据库连接池,让抽象工厂不再抽象

    在讲解抽象工厂之前,我们要了解两个概念:产品等级结构和产品族,如下图所示。
  • 08.31 00:47:18
    发表了文章 2023-08-31 00:47:18

    全面通透深入剖析工厂方法模式

    工厂方法模式主要适用于以下应用场景。 (1)创建对象需要大量重复的代码。 (2)客户端(应用层)不依赖产品类实例如何被创建、实现等细节。 (3)一个类通过其子类来指定创建哪个对象。
  • 08.31 00:42:07
    发表了文章 2023-08-31 00:42:07

    彻底说透简单工厂那些你没有关注过的细节

    接下来看代码,还是以创建一门网络课程为例。假设有Java架构、大数据、人工智能等课程,已经形成了一个生态。我们可以定义一个课程标准ICourse接口。
  • 08.31 00:36:28
    发表了文章 2023-08-31 00:36:28

    你以为委派模式很神秘,其实你每天都在用

    我们用代码来模拟老板给员工分配任务的业务场景。
  • 08.31 00:30:18
    发表了文章 2023-08-31 00:30:18

    使用桥接模式设计复杂的消息系统

    举个例子,我们在平时办公的时候经常通过邮件消息、短信消息或者系统内消息与同事进行沟通。尤其在走一些审批流程的时候,我们需要记录这些过程以备查。根据类型来划分,消息可以分为邮件消息、短信消息和系统内消息。但是,根据紧急程度来划分,消息可以分为普通消息、加急消息和特急消息。显然,整个消息系统可以划分为两个维度,如下图所示。
  • 08.31 00:26:19
    发表了文章 2023-08-31 00:26:19

    搞懂钩子方法和模板方法,看完这篇就够了

    通常的模板方法模式中会设计一个abstract的抽象方法,交给它的子类实现,这个方法称为模板方法。而钩子方法,是对于抽象方法或者接口中定义的方法的一个空实现,也是模板方法模式的一种实现方式。
  • 08.30 23:49:58
    发表了文章 2023-08-30 23:49:58

    用300行代码手写1个Spring框架,麻雀虽小五脏俱全

    为了解析方便,我们用application.properties来代替application.xml文件,具体配置内容如下:
  • 08.30 23:41:18
    发表了文章 2023-08-30 23:41:18

    基于Gradle的Spring源码下载及构建技巧

    首先你的JDK需要升级到1.8以上版本。从Spring 3.0开始,Spring源码采用GitHub托管,不再提供官网下载链接。这里不做过多赘述,大家可自行去GitHub网站下载,我使用的版本下载链接为 https://github.com/spring-projects/spring-framework/archive/v5.0.2.RELEASE.zip ,下载完成后,解压源码包会看到如下图所示的文件目录。
  • 08.30 23:34:25
    发表了文章 2023-08-30 23:34:25

    使用策略模式重构电商折扣和支付场景

    大家都知道,咕泡学院的架构师课程经常会有优惠活动,优惠策略有很多种可能,如领取优惠券抵扣、返现促销、拼团优惠等。下面用代码来模拟,首先创建一个促销策略的抽象PromotionStrategy。
  • 08.30 23:26:23
    发表了文章 2023-08-30 23:26:23

    高效接入第三方登录且易扩展的方法

    我们使用适配模式来实现一个实际的业务场景,解决实际问题。年纪稍微大一点的小伙伴一定经历过这样的过程。很早以前开发的老系统应该都有登录接口,但是随着业务的发展和社会的进步,单纯地依赖用户名密码登录显然不能满足用户需求。现在,大部分系统都已经支持多种登录方式,如QQ登录、微信登录、手机登录、微博登录等,同时保留用户名密码的登录方式。虽然登录形式丰富,但是登录后的处理逻辑可以不必改,都是将登录状态保存到Session,遵循开闭原则。首先创建统一的返回结果ResultMsg类。
  • 08.30 23:20:17
    发表了文章 2023-08-30 23:20:17

    一文读懂深克隆与浅克隆的关系

    在Java提供的API中,不需要手动创建抽象原型接口,因为Java已经内置了Cloneable抽象原型接口,自定义的类型只需实现该接口并重写Object.clone()方法即可完成本类的复制。 通过查看JDK的源码可以发现,其实Cloneable是一个空接口。Java之所以提供Cloneable接口,只是为了在运行时通知Java虚拟机可以安全地在该类上使用clone()方法。而如果该类没有实现 Cloneable接口,则调用clone()方法会抛出 CloneNotSupportedException异常。 一般情况下,如果使用clone()方法,则需满足以下条件。
  • 08.30 23:11:09
    发表了文章 2023-08-30 23:11:09
  • 08.30 23:01:27
    发表了文章 2023-08-30 23:01:27

    就因为把int改成Integer,第2天被辞了

    一个程序员就因为改了生产环境上的一个方法参数,把int型改成了Integer类型,因为涉及到钱,结果上线之后公司损失惨重,程序员被辞退了。信不信继续往下看。先来看一段代码:
  • 08.30 22:51:09
    发表了文章 2023-08-30 22:51:09

    趣谈装饰器模式,让你一辈子不会忘

    来看这样一个场景,上班族大多有睡懒觉的习惯,每天早上上班都时间很紧张,于是很多人为了多睡一会儿,就用更方便的方式解决早餐问题,有些人早餐可能会吃煎饼。煎饼中可以加鸡蛋,也可以加香肠,但是不管怎么加码,都还是一个煎饼。再比如,给蛋糕加上一些水果,给房子装修,都是装饰器模式。
  • 08.30 22:43:43
    发表了文章 2023-08-30 22:43:43

    为什么一定要学习设计模式

    先来看一个生活案例,当我们开心时,也许会寻求享乐。在学习设计模式之前,你可能会这样感叹:
  • 08.30 22:34:46
    发表了文章 2023-08-30 22:34:46

    用建造者模式实现一个防SQL注入的ORM框架

    以构建一门课程为例,一个完整的课程由PPT课件、回放视频、课堂笔记、课后作业组成,但是这些内容的设置顺序可以随意调整,我们用建造者模式来代入理解一下。首先创建一个产品类Course。
  • 08.30 22:28:32
    发表了文章 2023-08-30 22:28:32

    这才是责任链模式的优雅使用方式

    首先创建一个实体类Member。
  • 08.30 22:17:45
    发表了文章 2023-08-30 22:17:45

    从没有人将代理模式分析得如此透彻

    举个例子,有些人到了适婚年龄,会被父母催婚。而现在在各种压力之下,很多人都选择晚婚晚育。于是着急的父母就开始到处为子女相亲,比子女自己还着急。下面来看代码实现。创建顶层接口IPerson的代码如下。
  • 08.30 17:39:18
    发表了文章 2023-08-30 17:39:18

    这9个单例被破坏的事故现场,你遇到过几个?

    我们看到的单例模式通用写法,一般就是饿汉式单例的标准写法。饿汉式单例写法在类加载的时候立即初始化,并且创建单例对象。它绝对线程安全,在线程还没出现之前就实例化了,不可能存在访问安全问题。饿汉式单例还有另外一种写法,代码如下。
  • 08.30 17:15:33
    发表了文章 2023-08-30 17:15:33

    收藏这36个正则表达式,开发效率提高80%

    我们在日常的Java开发中,经常需要处理一些字符串,这个时候正则表达式是非常有用的。几乎在所有的编程语言中都支持正则表达式。以下我将压箱底多年的干货搬出来给大家参考,都是我们日常使用频次比较高的正则表达式,希望能能大大提高你的工作效率。如果本文对大家有帮助,大家可以关注“Tom弹架构”,后续会连载正则表达式的基础知识。
  • 08.30 16:55:30
    发表了文章 2023-08-30 16:55:30

    这样理解BAT必面之软件设计原则,还不会就是我的问题

    学习设计原则是学习设计模式的基础。在实际开发过程中,并不要求所有代码都遵循设计原则,我们要考虑人力、时间、成本、质量,不能刻意追求完美,但要在适当的场景遵循设计原则,这体现的是一种平衡取舍,可以帮助我们设计出更加优雅的代码结构。
  • 08.30 16:53:08
    发表了文章 2023-08-30 16:53:08

    软件架构设计原则之合成复用原则

    合成复用原则(Composite/Aggregate Reuse Principle,CARP)是指尽量使用对象组合(has-a)/聚合(contanis-a)而不是继承关系达到软件复用的目的。可以使系统更加灵活,降低类与类之间的耦合度,一个类的变化对其他类造成的影响相对较少。
  • 08.30 16:48:54
    发表了文章 2023-08-30 16:48:54

    软件架构设计原则之里氏替换原则

    里氏替换原则(Liskov Substitution Principle,LSP)是指如果对每一个类型为T1的对象o1,都有类型为T2的对象O2,使得以T1定义的所有程序P在所有的对象O1都替换成O2时,程序P的行为没有发生变化,那么类型T2是类型T1的子类型。
  • 08.30 16:42:50
    发表了文章 2023-08-30 16:42:50

    软件架构设计原则之迪米特法则

    迪米特原则(Law of Demeter LoD)是指一个对象应该对其他对象保持最少的了解,又叫最少知道原则(Least Knowledge Principle,LKP),尽量降低类与类之间的耦合度。迪米特原则主要强调:只和朋友交流,不和陌生人说话。出现在成员变量、方法的输入、输出参数中的类都可以称为成员朋友类,而出现在方法体内部的类不属于朋友类。
  • 08.30 16:38:19
    发表了文章 2023-08-30 16:38:19

    软件架构设计原则之接口隔离原则

    接口隔离原则符合我们常说的高内聚、低耦合的设计思想,可以使类具有很好的可读性、可扩展性和可维护性。我们在设计接口的时候,要多花时间去思考,要考虑业务模型,包括对以后有可能发生变更的地方还要做一些预判。所以,对于抽象、对于业务模型的理解是非常重要的。下面我们来看一段代码,对一个动物行为进行抽象描述。
  • 08.30 16:30:51
    发表了文章 2023-08-30 16:30:51

    软件架构设计原则之单一职责原则

    单一职责(Simple Responsibility Pinciple,SRP)是指不要存在多于一个导致类变更的原因。假设我们有一个类负责两个职责,一旦发生需求变更,修改其中一个职责的逻辑代码,有可能导致另一个职责的功能发生故障。这样一来,这个类就存在两个导致类变更的原因。如何解决这个问题呢?将两个职责用两个类来实现,进行解耦。后期需求变更维护互不影响。这样的设计,可以降低类的复杂度,提高类的可读性,提高系统的可维护性,降低变更引起的风险。总体来说,就是一个类、接口或方法只负责一项职责。
  • 08.30 16:22:48
    发表了文章 2023-08-30 16:22:48

    软件架构设计原则之依赖倒置原则

    依赖倒置原则(Dependence Inversion Principle,DIP)是指设计代码结构时,高层模块不应该依赖低层模块,二者都应该依赖其抽象。抽象不应该依赖细节,细节应该依赖抽象。通过依赖倒置,可以减少类与类之间的耦合性,提高系统的稳定性,提高代码的可读性和可维护性,并且能够降低修改程序所造成的风险。接下来看一个案例,还是以Course(课程)为例,先来创建一个类Tom:
  • 08.30 16:16:23
    发表了文章 2023-08-30 16:16:23

    软件架构设计原则之开闭原则

    开闭原则(Open-Closed Principle,OCP)是指一个软件实体(如类、模块和函数)应该对扩展开放,对修改关闭。所谓的开闭,也正是对扩展和修改两个行为的一个原则。它强调的是用抽象构建框架,用实现扩展细节,可以提高软件系统的可复用性及可维护性。开闭原则是面向对象设计中最基础的设计原则,它指导我们如何建立稳定、灵活的系统。例如版本更新,我们尽可能不修改源代码,但是可以增加新功能。
  • 08.30 16:10:16
    发表了文章 2023-08-30 16:10:16

    Spring版本命名规则

    常见软件的版本命名举例如下表所示。
  • 08.30 15:59:47
    发表了文章 2023-08-30 15:59:47

    Spring 5系统架构

    Spring大约有20个模块,由1300多个不同的文件构成。这些模块可以分为核心容器、AOP和设备支持、数据访问与集成、Web组件、通信报文和集成测试、集成兼容等类。Spring 5的模块结构如下图所示。
  • 08.30 15:52:17
    发表了文章 2023-08-30 15:52:17

    【题库类】华为芯片断供,危机or机遇

    1.局部变量能否和全局变量重名 点击空白处显示答案 ▼ 能,局部会屏蔽全局。
  • 08.30 14:44:40
    发表了文章 2023-08-30 14:44:40

    【紧急】Log4j又发新版2.17.0,只有彻底搞懂漏洞原因,才能以不变应万变,小白也能看懂

    经过一周时间的Log4j2 RCE事件的发酵,事情也变也越来越复杂和有趣,就连 Log4j 官方紧急发布了 2.15.0 版本之后没有过多久,又发声明说 2.15.0 版本也没有完全解决问题,然后进而继续发布了 2.16.0 版本。大家都以为2.16.0是最终终结版本了,没想到才过多久又爆雷,Log4j 2.17.0横空出世。
  • 08.30 14:44:01
    发表了文章 2023-08-30 14:44:01

    一张图彻底搞懂Spring循环依赖

    循环依赖就是指循环引用,是两个或多个Bean相互之间的持有对方的引用。BeanA 类依赖了Bean B类,同时Bean B类又依赖了Bean A类。这种依赖关系形成了一个闭环,我们把这种依赖关系就称之为循环依赖。Bean A类依赖了Bean B类,Bean B类依赖了Bean C类,Bean C类依赖了Bean A类,如此,也形成了一个依赖闭环。自己引用了自己,自己和自己形成了依赖关系。同样也是一个依赖闭环。
  • 08.30 14:39:04
    发表了文章 2023-08-30 14:39:04

    大厂高频面试题Spring Bean生命周期最详解

    Spring作为当前Java最流行、最强大的轻量级框架。Spring Bean的生命周期也是面试高频题,了解Spring Bean周期也能更好地帮助我们解决日常开发中的问题。程序员应该都知道Spring的基础容器是ApplicationContext。应很多粉丝的强烈建议,本文我来分析分析 ApplicationContext中Bean的生命周期。ApplicationContext是顶层容器接口BeanFactory的实现类,因此,我们了解了ApplicationContext的生命周期逻辑,也基本上了解了其他类型容器的生命周期逻辑。
  • 发表了文章 2023-09-01

    如果Spring中有两个ID相同的Bean,会报错吗?

  • 发表了文章 2023-09-01

    Java场景面试题:短信验证码接口被狂刷,怎么办?

  • 发表了文章 2023-09-01

    彻底讲明白Java中眼花缭乱的各种并发锁

  • 发表了文章 2023-09-01

    雪花算法的实现原理

  • 发表了文章 2023-09-01

    谈谈你对Spring MVC中的九大组件的理解?

  • 发表了文章 2023-09-01

    Java高频面试题,谈谈你对OAuth的理解,这道题你会了吗?

  • 发表了文章 2023-09-01

    谈谈你对Nacos配置动态更新原理的理解,这道题一定要会

  • 发表了文章 2023-09-01

    工作八年?是高级开发?竟然答不出:如何保证RabbitMQ的高可用?

  • 发表了文章 2023-09-01

    什么是乐观锁,什么是悲观锁?

  • 发表了文章 2023-09-01

    MySQL存储引擎MyISAM和InnoDB的区别

  • 发表了文章 2023-09-01

    ThreadLocal真的会造成内存泄漏吗?

  • 发表了文章 2023-09-01

    ConcurrentHashMap是如何保证线程安全的?

  • 发表了文章 2023-09-01

    为什么HashMap会产生死循环?

  • 发表了文章 2023-09-01

    Spring为何需要三级缓存解决循环依赖,而不是二级缓存?

  • 发表了文章 2023-09-01

    Spring Bean的生命周期全过程

  • 发表了文章 2023-09-01

    肝了30天总结,史上最全面透彻的Spring核心原理分析和27道高频面试题

  • 发表了文章 2023-09-01

    花了30天才肝出来,史上最全面Java设计模式总结,看完再也不会忘

  • 发表了文章 2023-09-01

    彻底搞懂Spring状态机原理,实现订单与物流解耦

  • 发表了文章 2023-09-01

    没有性能瓶颈的无限级菜单树应该这样设计

  • 发表了文章 2023-09-01

    Java场景面试题:手机扫码登录到底是怎么实现的?

正在加载, 请稍后...
滑动查看更多
正在加载, 请稍后...
暂无更多信息
正在加载, 请稍后...
暂无更多信息