自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

生命中有太多不确定

记录学习过程中的心得体会,与大家交流

  • 博客(129)
  • 资源 (1)
  • 问答 (1)
  • 收藏
  • 关注

原创 设计模式大白话——适配器模式

​ 适配器其实非常好理解,放到生活中来,我们身边处处都有这样的例子,最常见的是用的比较多的各种转接线(如:USB 转 Type-C),有了这个“适配器”,我们就能够将电脑和手机等设备相进行连接,而不需要改动电脑/手机的原有接口。

2023-08-31 09:51:45 1453

原创 设计模式大白话——命令模式

​顾名思义,命令模式其实和现实生活中直接下命令的动作类似,怎么理解这个命令是理解命令模式的关键!!!直接说结论是很不负责的行为,因此我将会结合之后的例子来向你介绍它,来帮助你更好的理解,而不是仅仅死记硬背它。这样你会在以后需要的时候想起它并且通过这个命令模式帮助你解决问题。​ 其实命令模式并不难,最最最核心的正入它的名字一样,是对业务 “命令” 的抽象,因此也有些地方把这个设计模式成为调用封装。命令模式将 “请求” 封装成对象,以便使用不同的请求、队列或日志来参数化其他对象。命令模式支持可撤销的操作。

2023-08-24 21:29:43 1704

原创 如何初始化Git仓库

您所在的目录将成为该 GitHub 存储库的源,并将该目录中的文件推送到该目录。以下文档默认电脑上已经安装了 git 命令,如果还没有安装 git 可以自行百度进行安装。现在你的目录现在已由 Git 进行管理了,并且有一个 GitHub 仓库来存储你的项目😊。​ 在这里,我们需要借助一个非常好用的工具,大家也可以参照。进行了上面的选择后,这个时候会打开浏览器进行授权。首先将目录变成Git仓库,但是这是本地的仓库。将目录下的文件都暂存起来,用于下一步的提交。进行阅读,下面介绍常用的安装命令。

2023-08-14 15:19:01 1946

原创 设计模式大白话——装饰者模式

​装饰者模式,此模式最核心之处在于装饰二字,之所以需要装饰,是因为基础的功能无法满足需求,并且装饰是临时的,并不是永久的,可以随场景变化替换成其他的。

2023-07-31 09:20:17 361

原创 设计模式大白话——观察者模式

与其叫他观察者模式,我更愿意叫他叫订阅-发布模式,这种模式在我们生活中非常常见,比如:追番了某个电视剧,当电视剧有更新的时候会第一时间通知你。当你预约了某款游戏后,游戏发布后就会立刻通知你,而不需要你每天都去关注游戏是否上线。​观察者模式定义了对象之间的一对多依赖,这样一来每当一个对象改变状态时,他所所有的依赖者都会收到通知并自动更新。

2023-07-24 08:42:54 427

原创 设计模式大白话——策略模式

从名字上来看,此设计模式的核心是策略二字,所谓策略,说白了就是能够针对不同的情况随机应变。接下来我将带你领略策略模式的魅力。

2023-07-20 09:56:24 156

原创 设计模式大白话——工厂模式

深入浅出地结合具体场景通过大白话介绍工厂模式

2023-07-18 09:44:41 420

原创 多少程序员一直活在楚门的世界里

这篇博客我是用手机写的,从大学里出来已经半年了多了,随着接触的东西的增加,才发现自己所处的网络是很受限的,很多学习资源/资料/论文等等通过常规手段都无法获取到,我也理解了培训机构和各种课程视频出现的原因,他们不过是知识的搬运工罢了。很多你在国内论坛看到的资源已经不知道是几手资源了,甚至会和出处有不一样的地方,一些比较懒一点的就干脆把内容照搬过来,只是简单翻译了一下。我曾经写了两年博客,到现在停了快1年了。对国内论坛的氛围有一点点的小失望,是因为你的原创内容会被很多人抄袭,甚至原文copy,这也是为什么你在

2023-03-04 15:50:45 223 3

原创 Go语言实现原理——锁实现原理

在多线程环境下,经常会设有, 我们这个时候只希望同时只能有一个线程进入执行,可以利用操作系统的原子操作来构建 ,这种方式简单高效,但是却无法处理一些复杂的情况,例如:为了解决上述问题,在操作系统的内部会为锁构建一个 , 用于之后的唤醒,防止其其一直空转。操作系统级别的锁会锁住整个线程,并且锁的抢占也会发生上下文切换。在Go语言中,拥有比线程更加轻量的协程,并且也在协程的基础之上实现了更加轻量级的互斥锁,用法示例如下:2、实现原理Go语言的互斥锁使用sync/atomic包中的原子操作来构建 ,其实说白了

2022-06-23 22:13:46 1286

原创 Go语言实现原理——Map实现原理

Map这一数据结构在很多语言中都存在,其查询的效率非常高,时间复杂度在O(1)的级别,其底层原理使用的是哈希表,通过计算的值,找到其所在的,然后再通过寻找其, 流程如下图所示由于bucket的数量有限,而k-v对的数量会越来越多,因此,在通过哈希值查找对应的bucket的时候可能出现多个哈希值对应一个bucket的情况,这就是hash碰撞。为解决这个问题,可以通过或来解决此类问题如果多个元素被放在一个bucket中,则会将他们以链表的形式组织起来,在查找到对应的bucket后,只需要对其进行遍历即可。缺点:

2022-06-23 22:09:41 1934

原创 Go语言实现原理——数组与切片

1.2、数组赋值于复制 💡 从上面的例子可以看出来,Go语言中,数组在进行赋值和作为参数进行传递的时候都是以值复制的形式1.3、编译时结构不难看出,编译阶段记录了保存的元素以及元素的数量值得注意的是:在编译阶段,会将长度小于4的数组放在栈中,大于4的则会放在静态只读区中,下面通过一个例子来验证一下示例代码:对比两次输出的结果不难看出,的长度从3变成5之后,其内存地址就不再和、、紧挨着了,也就是没有被分配在栈中了相比较数组,切片的长度是可变的,因此也不需要指定长度2.2、切片的数据结构是.

2022-06-14 16:30:23 254 1

原创 Go语言实现原理——字符串本质

字符串的本质是一个字符数组,其结构如下所示: 💡 字符串常量存储于静态存储于,无法被修改Go语言中使用的是字符集,这是一种长度不固定的编码方式,也就是有不同的字符,所占用的字节数可能不一样,下面是示例:图解:代码:2、Rune类型在Go语言中,由于不同的字符所占字节大小可能不同,为了区分字符,使用类型来表示单个字符,其本质上其实是,用于区分字符值与整数值因此,在对字符串使用range操作时,遍历的并非字是单个字节,而是,在使用下标对字符串进行操作时其实也是在操作字符数组字符串在声明时既可以使用.

2022-06-13 17:56:29 542

原创 Go连接Redis

轻松学会连接Redis

2022-05-07 14:54:32 745 1

原创 Go语言实现原理——浮点数

Go语言实现原理——浮点数文章目录Go语言实现原理——浮点数浮点数1、概述2、浮点数转换3、NaN与Inf4、浮点数精度4.1、概念4.2、浮点数计算时的精度丢失5、浮点数的格式化打印6、math/big库浮点数1、概述在使用二进制在表示小数时,无法准确表示0.1、0.01、0.001,因此能做的就只有提高精度,而定点数由于位数限制,精度无法满足需求,因而采用浮点数表示小数。Go语言中的浮点数遵循**IEEE-754**标准。格式如下:精度符号位指数为小数位偏移量单精度(

2022-05-05 18:17:52 1327

原创 小数转浮点数

小数转浮点数下面对上图案例进行解释符号位0(正),1(负)小数部分0.085(十进制)=0.00010101110000101000111101011100001010001111010111000011(二进制)=1.0101110000101000111101011100001010001111010111000011×2 −4^{-4}−4 💡 此处要进行四舍五入 小数部分取第一个1后面的23位得到 010 1110 0001 0100 0111 1011

2022-05-05 18:15:51 1175 1

原创 解决:Import googleapiannotations.proto was not found or had errors

解决:Import “google/api/annotations.proto” was not found or had errors.一、问题概述在使用protoc命令的时候,很可能会出现这样的问题。因为proto文件中有类似于import "google/api/annotations.proto";这样的导包操作,protoc命令默认会导入同级目录下的proto文件,所以,如果你import的是同级目录下的proto文件一般不会出现was not found or had errors.的问题

2022-04-10 15:32:04 9049 2

原创 使用go实现一个可以显示进度条的线程池

使用go实现一个可以显示进度条的线程池一、概述​ 有些情况下,我们的程序可能同时有好几个goroutine在跑,并且你想要动态地显示每个goroutine的进度条(比如下载一些比较多大的文件的时候),如果你没有这个需求,只想利用多个线程去去执行一些任务,并不想显示进度条,想去设置参数,不让线程池显示不得不承认,当前线程池还有一写细节地方可以改进,后续将会在gitee仓库(https://gitee.com/he_fu_ren/thread-pool-with-progress-bar)进行更新,如果有

2022-03-29 00:18:04 1330

原创 批量将B站学习视频以MP4格式下载到本地

批量将B站学习视频以MP4格式下载到本地一、背景描述有些爱学习的小伙伴可能在外出或者回老家过节前会有提前将学习视频缓存的习惯,但是缓存的视频只能用BilibiliApp来看,屏幕属实有一点点小,因此更想将其下载到电脑上,然后用自己喜欢的播放器去观看(如potPlayer)。本篇博客将分享个JS脚本,利用免费解析网站,来实现批量的视频下载。后续如果有bug将会在gitee上进行更新: https://gitee.com/he_fu_ren/bilibili-video-download注:本脚本仅供

2022-03-26 20:19:59 8582 10

原创 解决: protoc-gen-go unable to determine Go import path for “*.proto“

解决:protoc-gen-go: unable to determine Go import path for “*.proto”问题概述在使用 protoc命令根据*.proto文件生成*pb.go文件时报了标题中的错误,并且在错误的下方,会提示相应的解决办法,这里我们使用的是第一种,稍微翻译一下就知道,可以通过go_package去指定生成的go文件的位置Please specify either: • a "go_package" option in the .proto s

2022-03-24 23:29:53 4628

原创 GoLang并发编程之Future模式的实现

GoLang并发编程之Future模式的实现文章目录GoLang并发编程之Future模式的实现一、概述二、代码示例三、小结一、概述​ 在日常编程中,可能会遇到这样一个场景,一个任务可能有好几件事需要去做,并且这些事是完全可以并发执行的,除此之外,我们还需要得到其执行结束后的结果,并以此来进行后续的一些处理。​ 这个时候就可以考虑去使用Go编程当中的Future模式二、代码示例1、构建结构体FutureTask​ 这里我们将要做的事情抽象成任务,对于每个任务我们可能需要传递参数过去,并且我

2022-03-20 01:52:45 738

原创 解决 Public key for xxx.rpm is not installed 公钥未安装

解决 Public key for xxx.rpm is not installed问题概述在使用yum安装软件失败后提示了类似于下面下信息# 对应的公钥未安装Public key for 67ffa375b03cea72703fe446ff00963919e8fce913fbc4bb86f06d1475a6bdf9-cri-tools-1.19.0-0.x86_64.rpm is not installed意义是说我没有安装校验这个软件的公钥,因为使用yum下载软件的时候会对下载下来的文件做校

2022-03-07 18:12:24 5916

原创 Spring注解扫描原理浅析

Spring注解扫描原理浅析一、概述​ 本篇文章将会带着大家通过阅读源码的方式去揭秘Spring的注解扫描原理,如果你想让源码可编辑,那么可以把源码下载下来然后进行调试,关于编译Spring源码,我推荐这篇文章——(spring源码系列(六)——番外篇如何编译spring的源码。​ 很多人一提到源码都会比较排除,可能是因为注释都是英文,又或者类名或方法名太长记不住等原因。本篇文章会手把手带你看源码,中间过程不重要,很多代码不需要过多关注,只需要对重点代码片段和方法进行关注即可。废话不多说,我们这就开始

2022-02-16 15:54:47 1677

原创 SpringBoot整合Xxl-job实现定时任务

SpringBoot整合Xxl-job实现定时任务本文目录SpringBoot整合Xxl-job实现定时任务一、部署调度中心1、项目下载2、初始化数据3、修改properties配置文件二、部署SpringBoot项目1、引入依赖2、创建配置类3、修改配置文件4、创建执行器5、启动SpringBoot项目三、通过调度中心进行任务调度1、添加执行器2、添加任务3、任务调度中心发起任务调度四、小结​ XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并

2022-01-16 12:19:29 2239 2

原创 Spring中使用@Async让方法异步执行

Spring中使用@Async让方法异步执行本文目录Spring中使用@Async让方法异步执行一、概述二、开启步骤三、测试一、概述​ 很多时候,为了提高性能我们都需要引入多线程来提高系统性能,说通俗点就是让方法异步执行。实现这个目的可以用执行异步方法的工具类,开个线程去执行。而在Spring中,则可以使用@Async注解,相比较工具类会更加优雅,本篇文章将会详细地介绍如何去使用二、开启步骤配置线程池创建配置类ThreadPoolConfig.calss,异步方法最终会在这个线程池中被执行

2022-01-12 23:08:44 629

原创 手把手带你手写一个单调队列

带你手写一个单调队列本文目录带你手写一个单调队列一、概述二、原理三、代码实现一、概述​ 本文将带你彻底搞懂单调队列的原理,并用代码进行实现。有一到经典的用单调队列解决的LeetCode题——滑动窗口最大值。二、原理​ 首先先看看这个单调队列用于解决的问题:用于确定当前的最值,当然,也可以确定滑动窗口的最值。我在这里举个例子你们就会明白:​ 目前有这样一个帮会,实例最强的就可以当老大,实力我们用数值来表示,帮会人数最多为3人。下面是进入帮会的顺序:1,3,-1,-3,5,3,6,7,因为最多只能

2021-12-10 19:43:03 654

原创 手把手讲解AQS源码

本文将会通过ReentrantLock为例,带大家看一下AQS的源码,其实并不难,下面是一个公平锁的小案例,大家可以自己跑一下感受一下。下面将会带大家一点一点阅读源码,认真看下来你就会发现其实并不难。

2021-12-03 22:45:35 488

原创 MySQL进阶之路(二十一)—— 5分钟搞懂MySQL中的优化器与成本模型

5分钟搞懂MySQL中的优化器与成本模型本文目录5分钟搞懂MySQL中的优化器与成本模型一、概述二、优化器三、成本模型四、成本计算示例1、全表扫描2、使用索引进行回表查询3、多表连接查询五、总结一、概述​ 在之前的文章中我们学习了SQL的执行计划,通过possible_keys字段可以看得出来一个SQL在执行查询操作的时候有多个索引可供使用的,换句话说就是有很多种方式来完成这次查询。在这种情况下,我们必须要选择一个执行计划来完成查询,正是为了完成执行计划的选择,才有了查询优化器这个东西。本篇文章将会介

2021-12-01 16:28:05 1554

原创 MySQL进阶之路(二十)—— 5分钟看懂SQL的执行计划

5分钟看SQL的执行计划一、概述​ 如果你想优化SQL语句,那么SQL执行计划就是必须要知道的,因为只有通过SQL的执行计划,你才可以知道SQL是如何进行查询的,以及否走索引、用的是什么索引、是否进行了排序又是如何排序的等等信息。​ 在应用层面其实就是在SQL语句前面加上Explain,我在前面的文章中有涉及到这个的使用,但是没有细说,今天我们专门来讲一讲这个Explain输出的信息都是什么意思二、Explain输出的列列意义id该SELECT标识符select_typ

2021-11-19 16:50:27 4697 1

原创 彻底搞懂JVM从启动到结束的过程

JVM从启动到结束会经历什么?文章目录JVM从启动到结束会经历什么?1、Load the Class(加载类)双亲委派机制2、Link(链接)验证准备解析(可选)3、Initialize (初始化)初始化锁4、Creation of New Class Instances(创建新的实例)显示实例化和隐式实例化实例化过程5、Finalization of Class Instances(类实例的终结)特点6、Unloading of Classes and Interfaces(卸载类和接口)特点7、Pro

2021-11-07 15:36:17 365

原创 MySQL进阶之路(十九)—— Order By 和 Group By 优化

Order By 和 Group By 优化文章目录Order By 和 Group By 优化一、Order By 优化示例注意事项小结二、Group By 优化隐式排序与显示排序示例作用三、本篇总结一、Order By 优化​ 在平时工作中肯定很多地方会需要用到Order By进行排序,比如总是展示最新的数据,这个其实就是按照时间排序,再比如,根据积分等进行排名。等等等等。真的太普遍了。​ 对于排序,你可能会觉得是不是根据where条件选出一波数据,然后加载到内存中进行排序,又或者是使用一个临时

2021-10-31 17:59:19 463

原创 MySQL进阶之路(十八)—— 最常用的索引使用规则

最常用的索引使用规则(干货篇)文章目录最常用的索引使用规则(干货篇)一、概述二、常用规则1、等值匹配规则2、最左匹配规则3、最左前缀匹配规则4、范围匹配规则5、最左匹配规则 + 等值匹配规则 + 范围匹配规则三、小结一、概述​ 在前面的几篇文章中,详细讲解了索引的原理以及B+树的结构,今天,就这此基础之上来聊聊平时开发中经常可以用到索引的一些地方。这样大家在平时写SQL的时候就会去留意这些点,从而改善查询的性能。​ 本文种的截图使用到了 Explain,这个是用于分析SQL语句的执行情况的,以后

2021-10-30 15:49:20 376

原创 对动态规划思想的理解

对动态规划思想的理解文章目录对动态规划思想的理解一、概述二、通过问题来发掘共同点三、总结一、概述​ 动态规划,最核心的就是动态转移方程,这个动态转移方程想要表达的意思说白了就当前状态和前一个状态有关,换句话说,当前的状态与之前的状态有关,或者是当前状态是根据之前已经有的状态“转移”过来的。​ 这里还有一个难点,就是状态如何定义的问题,一般来说,这个状态与多个其他的状态有关。听起来是不是很抽象,下面我们来看看几个例子二、通过问题来发掘共同点01背包问题——引出问题​ 这种问题,相信这种问题大

2021-10-27 18:12:29 193

原创 MySQL进阶之路(十七)—— 复合索引及最左匹配原则探究

复合索引及最左匹配原则探究文章目录复合索引及最左匹配原则探究一、概述二、联合索引是长什么样子的?三、如何建立和使用复合索引四、覆盖索引是什么?五、总结一、概述​ 上一篇文章中介绍了B+树是如何根据索引构造出来的以及如何使用索引去查询数据的,不知道你有没有发现,那些例子都是某一列作为索引,比较好理解,而今天,我们将要说的是多个列组成的索引是什么样子的,以级其使用的规则。二、联合索引是长什么样子的?​ 如果说只有一个列,那么匹配起来是非常简单的,我们只需要对一个列的值不断地进行比较就可以了,但是如果是

2021-10-24 17:28:24 265

原创 MySQL进阶之路(十六)—— 透彻理解InnoDB中的B+树以及回表操作

透彻理解InnoDB中的B+树及回表操作文章目录透彻理解InnoDB中的B+树及回表操作一、概述二、透彻理解B+树之前必需知道的点三、为什么会用B+树来存储?四、B+树到底长什么样?五、那回表查询是什么样的操作?六、小结一、概述​ 在上一篇文章中详细的介绍了记录和数据页在磁盘上的结构,没有看过的可以点这里去快速把知识补上,今天将在此基础之上以一个更大的视角去探究一下B+树的结构。​二、透彻理解B+树之前必需知道的点​ 1、首先,记录都是存储在数据页中的,并且是通过next指针构成了单链表的结构

2021-10-23 17:14:51 521

原创 MySQL进阶之路(十五)—— InnoDB中记录与数据页的结构详解及如何构成B+树

InnoDB中记录与数据页结构及如何构成B+树文章目录InnoDB中记录与数据页结构及如何构成B+树一、概述二、为什么需要BufferPool?三、Buffer Pool中的记录是什么样的结构?1、底层结构2、各个部分的作用FIELD START OFFSETSEXTRA BYTESFIELD CONTENTS四、Buffer Pool中的数据页是什么样的结构?1、底层结构2、各部分的作用File Page HeaderPage HeaderInfimum 和 Supremum 记录User Record

2021-10-22 15:55:54 326

原创 MySQL进阶之路(十四)—— InnoDB中的锁是怎样的?一篇搞懂它!

MySQL进阶之路(十四)—— InnoDB中的锁是怎样的?一篇搞懂它!本文目录MySQL进阶之路(十四)—— InnoDB中的锁是怎样的?一篇搞懂它!一、概述二、MySQL中的锁是如何工作的三、MySQL中有哪些锁?**共享锁/排它锁**意向锁记录锁间隙锁Next-Key锁其他锁四、小结一、概述​ 在上一篇文章中详细介绍了MVCC机制,它解决的是在有其他的事务在更新时如何读的问题,而今天将要介绍的解决的是其他事物在更新时如何更新的问题。其实加锁这一机制不仅仅是在MySQL中,在很多计算机语言中你都能

2021-10-19 17:51:19 181

原创 MySQL进阶之路(十三)—— MVCC的原理及意义探究

MySQL进阶之路(十三)—— MVCC的原理及意义探究一、概述​ 上一篇文章说到了InnoDB引擎的事务的隔离级别,本篇文章将会详细的介绍MVCC机制,涉及到的内容 比较多,但是都不难。​ MVCC是 multiversion concurrency control的简写,中文意思是多版本并发控制,该技术允许具有特定隔离级别的InnoDB事务执行一致的读操作;除了可以查询其他事物正在更新的数据之外,还可以查询这些更新发生之前的数据。此技术大大地提高了数据库的并发性,使得查询操作不需要等到其他事物持

2021-10-07 20:38:08 193

原创 MySQL进阶之路(十二)——事务的4种隔离级别分别是什么

MySQL进阶之路(十二)——事务的4种隔离级别分别是什么一、概述​ 在上一篇文章中给大家详细介绍了多个事务并发执行的场景下出现脏写、脏读、不可重复读和幻读的原因,本篇文章将会给大家详细介绍MySQL为了防止上述情况的发生分别是如何去做的​ 回顾之前所学的,事务具有ACID四种特性,其中 I 指的是事务的隔离性,对于隔离性,又有不同的隔离级别,不同的隔离级别本质上其实是在事务同时进行更改或查询操作时在结果的性能、可靠性、一致性和可再现性之间所作的取舍不同而已。​ InnoDB支持的隔离级别有:S

2021-10-04 19:42:30 134

原创 MySQL进阶之路(十一)—— 为什么会出现脏写、脏读、不可重复读与幻读

为什么会出现脏写、脏读、不可重复读与幻读一、概述​ 我们平时的业务系统和数据库的连接并不是单个,一般都会同时有多个线程操作数据库,也就可能会出现多个线程同时操作同一个数据的情况,而且很多操作一般都是以事务的方式进行,可以借助redo log重做或者undo log回滚,如果是单个事务,肯定是没有什么问题的,但是如果是多个事务就会发生一些奇怪的现象。二、脏写是怎么出现的?​ 现在有事务A和事务B两个事物,他们会操作同一个数据C,A先将C改成了A,然后B又将值改成了B,然后事务B提交了。还记得事务A在

2021-09-14 21:26:16 934 5

原创 MySQL进阶之路(十)——再探undo log原理

再探undo log原理一、概述​ 在上一篇文章中我们详细介绍了redo log日志,介绍了redo log的作用、如何实现故障恢复、刷盘策略等,如果有忘记的小伙伴可以点这里快速复习一下。​ 本篇文章将详细介绍undo log的原理二、undo log的作用​ 如果学习过前面几篇的文章,就已经知道了undo log的作用——用于事务的回滚。为什么事务需要回滚呢?这就不得不说到事务的ACID原则了,其中的A就是事务的原子性:当一个事物对数据库进行多次更改时,在提交时要么所有的改动都成功,要么在回滚事

2021-09-13 16:47:47 248

设计模式之六大原则详解,Markdown笔记

详细介绍了设计模式六大原则,配有示例代码和图片,有开闭原则,单一职责原则,里氏替换原则,依赖倒置原则,接口隔离原则,迪米特法则等等。

2020-11-18

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

TA关注的人

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