自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(43)
  • 收藏
  • 关注

原创 015.设计模式与范式:结构型--适配器模式

51. 适配器模式:代理,适配器,桥接,装饰,这四个模式有何区别1. 适配器模式的原理与实现这个模式就是用来做适配的,它将不兼容的接口转换为可兼容的接口,让原本由于接口不兼容而不能一起工作的类可以一起工作。适配器模式有两种实现方式:类适配器和对象适配器。其中,类适配器使用继承关系来实现,对象适配器使用组合关系来实现类适配器 && 对象适配器// 类适配器: 基于继承public interface ITarget { void f1(); void f2();

2020-09-15 17:25:16 121

原创 014.设计模式与范式:结构型--装饰者模式

1. Java IO 类的“奇怪”用法IO流读取文件写法InputStream in = new FileInputStream("/user/wangzheng/test.txt");InputStream bin = new BufferedInputStream(in);byte[] data = new byte[128];while (bin.read(data) != -1) { //...}我们会觉得 Java IO 的用法比较麻烦,需要先创建一个 FileInpu

2020-09-15 15:49:53 118

原创 013.设计模式与范式:结构型--桥接模式

49.桥接模式:如何实现支持不同类型和渠道的消息推送系统一. 桥接模式的原理解析一个类存在两个(或多个)独立变化的维度,我们通过组合的方式,让这两个(或多个)维度可以独立进行扩展。”通过组合关系来替代继承关系,避免继承层次的指数级爆炸JDBC 驱动是桥接模式的经典应用Class.forName("com.mysql.jdbc.Driver");//加载及注册JDBC驱动程序String url = "jdbc:mysql://localhost:3306/sample_db?user=roo

2020-09-15 15:17:11 109

原创 012.设计模式与范式:结构型--代理模式

代理模式:代理在RPC、缓存、监控等场景中的应用一.代理模式的原理解析它在不改变原始类(或叫被代理类)代码的情况下,通过引入代理类来给原始类附加功能。例子: MetricsCollector 类,用来收集接口请求的原始数据,比如访问时间、处理时长等原始public class UserController { //...省略其他属性和方法... private MetricsCollector metricsCollector; // 依赖注入 public UserVo lo

2020-09-15 15:01:25 82

原创 011.设计模式与范式:创建型--原型模式

原型模式八.原型模式:如何最快速地clone一个HashMap散列表?1. 原型模式的原理八.原型模式:如何最快速地clone一个HashMap散列表?1. 原型模式的原理如果对象的创建成本比较大,而同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象(原型)进行复制(或者叫拷贝)的方式来创建新对象,以达到节省创建时间的目的。这种基于原型来创建对象的方式就叫作原型设计模式(Prototype Design Pattern),简称原型模式。...

2020-09-15 14:27:23 109

原创 010.设计模式与范式:创建型--建造者模式

建造者模式六.建造者模式:详解构造函数、set方法、建造者模式三种对象创建方式1. 为什么需要建造者模式?2. 与工厂模式有何区别?3. 使用场景,避免过度使用六.建造者模式:详解构造函数、set方法、建造者模式三种对象创建方式Builder 模式,中文翻译为建造者模式或者构建者模式,也有人叫它生成器模式。1. 为什么需要建造者模式?在平时的开发中,创建一个对象最常用的方式是,使用 new 关键字调用类的构造函数来完成。我的问题是,什么情况下这种方式就不适用了,就需要采用建造者模式来创建对象呢

2020-06-30 09:20:23 119

原创 009.设计模式与范式:创建型--工厂模式

工厂模式四.工厂模式(上):为什么说没事不要随便用工厂模式创建对象?1. 简单工厂2. 工厂方法3. 什么时候该用工厂方法模式,而非简单工厂模式呢4. 抽象工厂5.总结五.工厂模式(下):如何设计实现一个Dependency Injection框架?1. DI容器2. 工厂模式和 DI 容器有何区别?3. DI 容器的核心功能有哪些?1. 配置解析2. 对象创建3. 生命周期管理4. 如何实现一个简单的 DI 容器?四.工厂模式(上):为什么说没事不要随便用工厂模式创建对象?一般情况下,工厂模式分为三

2020-06-29 19:39:48 144

原创 008.设计模式与范式:创建型--单例模式

创建型一.单例模式(上):为什么说支持懒加载的双重检测不比饿汉式更优?1. 为什么要使用单例?2. 如何实现一个单例?3. 饿汉式4. 懒汉式5. 双重检测6. 静态内部类7. 枚举二.单例模式(中):为什么不推荐使用单例模式?又有何替代方案?1. 单例存在哪些问题?1. 单例对 OOP 特性的支持不友好2. 单例会隐藏类之间的依赖关系3. 单例对代码的扩展性不友好4. 单例对代码的可测试性不友好5. 单例不支持有参数的构造函数6. 单例不支持有参数的构造函数2. 有何替代解决方案?三.单例模式(下)

2020-06-29 19:39:26 155

原创 007.设计原则与思想:总结

一.总结回顾面向对象、设计原则、编程规范、重构技巧等知识点1. 面向对象基于接口而非实现编程应用这条原则,可以将接口和实现相分离,封装不稳定的实现,暴露稳定的接口。上游系统面向接口而非实现编程,不依赖不稳定的实现细节,这样当实现发生变化的时候,上游系统的代码基本上不需要做改动,以此来降低耦合性,提高扩展性多用组合少用继承(1). 为什么不推荐使用继承?继承是面向对象的四大特性之一,用来表示类之间的 is-a 关系,可以解决代码复用的问题。虽然继承有诸多作用,但继承层次过深、过复杂,

2020-06-28 11:27:54 92

原创 006.设计原则与思想:规范与重构

规范与重构一.理论一:什么情况下要重构?到底重构什么?又该如何重构?1. 重构的目的:为什么要重构(why)?2. 重构的对象:到底重构什么(what)?3. 重构的时机:什么时候重构(when)?4. 重构的方法:又该如何重构(how)?二.理论二:为了保证重构不出错,有哪些非常能落地的技术手段?1. 什么是单元测试?2. 为什么要写单元测试?三.理论三:什么是代码的可测试性?如何写出可测试性好的代码?1. 单元测试三.理论四:如何通过封装、抽象、模块化、中间层等解耦代码?1. “解耦”为何如此重要?2.

2020-06-24 11:51:17 317

原创 004.设计原则与思想:设计原则

一.理论一:对于单一职责原则,如何判定某个类的职责是否够“单一”?1. 如何理解单一职责原则(SRP)?单一职责原则一个类或者模块只负责完成一个职责(或者功能)一个类包含了两个或者两个以上业务不相干的功能,那我们就说它职责不够单一,应该将它拆分成多个功能更加单一、粒度更细的类。例子:比如,一个类里既包含订单的一些操作,又包含用户的一些操作。而订单和用户是两个独立的...

2020-04-15 17:58:39 425

原创 002.持久层框架设计实现及MyBatis源码分析-----自定义持久层框架

一.JDBC问题分析JDBC使用/** * JDBC连接 * @param args */ public static void main(String[] args) { Connection connection = null ; PreparedStatement preparedStatement = null ...

2020-04-13 14:19:24 282

原创 005.设计原则与思想:面向对象

一.业务开发常用的基于贫血模型的MVC架构违背OOP吗?1.什么是基于贫血模型的传统开发模式?像 UserBo 这样,只包含数据,不包含业务逻辑的类,就叫作贫血模型(Anemic Domain Model)。同理,UserEntity、UserVo 都是基于贫血模型设计的。这种贫血模型将数据与操作分离,破坏了面向对象的封装特性,是一种典型的面向过程的编程风格2.什么是基于充血模型的 DD...

2020-04-10 18:06:52 100

原创 1. 面向对象

一.封装、抽象、继承、多态分别可以解决哪些编程问题?封装封装也叫作信息隐藏或者数据访问保护。类通过暴露有限的访问接口,授权外部仅能通过类提供的方式(或者叫函数)来访问内部信息或者数据抽象封装主要讲的是如何隐藏信息、保护数据,而抽象讲的是如何隐藏方法的具体实现抽象这个概念是一个非常通用的设计思想,并不单单用在面向对象编程中,也可以用来指导架构设计等。而且这个特性也并不需要编程语言提供...

2020-04-08 17:46:39 119

原创 设计模式导读

导读-设计模式分类创建型:常用的有:单例模式、工厂模式(工厂方法和抽象工厂)、建造者模式。不常用的有:原型模式结构型常用的有:代理模式、桥接模式、装饰者模式、适配器模式不常用的有:门面模式、组合模式、享元模式行为型常用的有:观察者模式、模板模式、策略模式、职责链模式、迭代器模式、状态模式。不常用的有:访问者模式、备忘录模式、命令模式、解释器模式、中介模面...

2020-04-08 16:00:07 133

原创 前端--ES6入门

前言:临时接手前端小程序,需补充下ES6用法一.let 与 constlet 声明的变量只在 let 命令所在的代码块内有效。const 声明一个只读的常量,一旦声明,常量的值就不能改变。for 循环计数器很适合用 letconst 声明一个只读变量,声明之后不允许改变。意味着,一旦声明必须初始化,否则会报错二.解构赋值解构赋值是对赋值运算符的扩展。1. 数组模型解构基...

2020-03-05 16:41:03 98

原创 Redis API的理解和使用

一.通用命令key key + 类通配符 key命令一般不在生产环境使用,key多慢。dbsizedbsize 时间复杂度为O1级别,可以在生产环境中使用existsexists 时间复杂度为O1级别,可以在生产环境中使用del可以同时删除多个expire , ttl , persisttype时间复杂度二. 数据结...

2019-01-29 15:20:19 197

原创 《编程思想》11.泛型

1 . 泛型的主要目的之一就是用来指定容器要持有什么类型的对象。2 . 简单泛型(1)有许多原因促成了泛型的出现,而最引人注目的一个原因就是为了创造容器类。public class Holder3<T> { private T a ; public Holder3(T a){ this.a = a ; } public void s...

2019-01-27 14:33:42 121

原创 《编程思想》10.持有对象

.java文件通常被称为编译单元,每个编译单元只能有一个public类,否则编译器就不会接受。类中域为基本类型时自动被初始化为零,但是对象引用会被初始化为nullJava用super关键字表示超类的意思,表达式super.scrub()将调用基类版本的scrub()方法final关键字:一个永不改变的编译时常量,一个在运行时被初始化的值,而你不希望它被改变。这类常量必须是基本...

2019-01-27 14:31:04 77

原创 《编程思想》9.内部类

一.创建内部类(1)内部类了解外围类,并能与之通信(2)创建内部类方式:把类的定义置于外围类的里面public class Parcel1 { //内部类1 class Contents{ private int i = 11 ; public int value(){ return i ; } } //内部类2 class Destination{ ...

2019-01-27 14:29:53 79

原创 《编程思想》8.接口

一.抽象类和抽象方法1.建立这个通用接口的唯一理由是,不同的子类可以用不同的方法表示此接口。2.如果一个类包含一个或多个抽象方法,该类必须被限定为抽象。成为抽象类并不需要所有的方法都是抽象的,仅需将某些方法声明为抽象的即可。interface Instrument1 { int VALUE = 5 ; //在该类中没有任何方法被声明为是public的,但是它们自动就都是public...

2019-01-27 14:28:35 93

原创 《编程思想》7.多态

这种把对某个对象的引用视为对其基类型的引用的做法被称作向上转型----因为在继承数的画法中,基类是放置在上方的。public class Test { public enum Note{ MIDDLE_C , C_SHARP , B_FLAT ; } class Instrument{ public void play(Note n...

2019-01-27 14:25:32 132

原创 《编程思想》6.复用类

1.每个编译单元都必须有一个后缀名.java,而在编译单元则可以有一个public类,每个编译单元只能有一个public类,否则编译器就会接受2.组合语法:只需将对象引用置于新类中即可。public class WaterSource { private String s ; WaterSource(){ System.out.println("WaterSource()"); s...

2019-01-27 14:23:59 91

原创 Redis命令

查看redis进程ps -ef | grep -i redis//结构:ps -ef |grep abc //查看含有"abc"的活动进程ps -ef |grep -v abc //查看不含abc的活动进程启动redis服务/usr/local/redis/bin/redis-server执行文件.filenameLinux修改PATH环境变量#通过修...

2019-01-26 17:22:50 85

原创 Redis初识

数据结构一.Redis特性速度快(1) 数据存储到内存中持久化(断电不丢失数据)(1)Redis所有数据保持到内存中,对数据的更新将异步地保存到磁盘中多种数据结构(1) 除以上五种版本新增BitMaps : 位图HyperLogLog : 超小内存唯一计数GEO : 地理信息定位支持多种客户端语言简单(1) 不依赖外部库(2) 单线程模型主从...

2019-01-26 17:15:24 78

原创 重构--改善既有代码的设计

函数重构规则一.Extract Method(提取函数) — 将大函数按模块拆分成几个小函数二.Inline Method(内联函数) — 将微不足道的小函数进行整合将过度封装的函数在放回去,或者将那些没有必要封装的函数放回去。三.Replace Temp with Query(以查询取代临时变量) — 将一些临时变量使用函数取代将那些有着复杂表达式赋值并且多次使用的临时变量使用查...

2019-01-26 11:48:27 225

原创 SQL优化

一.负项查询不能使用索引select name from user where id not in (1,3,4);改为:select name from user where id in (2,5,6); 二.前导模糊不能使用索引如:select name from user where name like '%zhangsan'改为:select name ...

2019-01-26 10:57:25 71

原创 《高性能MySql》六.查询性能优化

1.为什么查询速度会慢  2.慢查询基础:优化数据访问1.查询性能低下最基本的原因是访问的数据太多,大部分性能低下的查询都可以通过减少访问的数据量的方式进行优化。 2.是否向数据库请求了不需要的数据,有些查询会请求实际需要的数据,然后这些多余的数据被应用程序(1)查询不需要的数据:常常会误以为MySql会只返回需要的数据,实际上MySql却是先返回全部结果集再进行计算...

2019-01-02 16:54:29 127

原创 《高性能MySql》五.创建高性能索引

索引基础1.存储引擎用类似的方法使用索引,其先在索引中找到对应值,然后根据匹配的索引记录找到对应的数据行。2.mysql只能高效地使用索引的最左前缀列。创建一个包含两个列的索引,和创建两个只包含一列的索引是大不相同。3.索引的类型(1)索引是在存储引擎层而不是服务器层实现的。不同存储引擎的索引工作方式并不一样的。底层的实现也可能不同。(2)B-Tree索引如果没有指明类型,...

2018-12-30 17:03:54 69

原创 《高性能MySql》四.Schema与数据类型优化

选择优化的类型1.尽量使用可以正确存储数据的最小数据类型 2.简单数据类型的操作通常需要更少的CPU周期,例如:整型比字符操作代价更低,因为字符需要校验。应该使用mysql内建的类型而不是字符串来存储日期和时间。 3.TIMESTAMP只使用DATETIME一半的存储空间,并且会根据时区变化,具有特殊的自动更新能力。TIMESTAMP允许的时间范围要小得多。 4.整数类...

2018-12-30 16:58:57 93

原创 《高性能MySql》二.

基准测试1.基准测试可以观察系统在不同压力下的行为,可以在系统实际负载之外创造一些虚构场景进行测试。 2.集成式测试工具(1)ab : HTTP服务器基准测试工具。测试HTTP服务器每秒最多可以处理多少请求。只能针对单个URL进行尽可能的压力测试。 性能优化1.性能即响应时间 2. Performance Schema  用于监视MySQL服务器,且运行时消耗很...

2018-12-30 16:57:07 66

原创 《高性能MySql》一.MYSQL架构和历史

MYSQL逻辑架构1.Mysql架构图并发控制1.读写锁(1)共享锁 和 排他锁 ,也叫读锁 和 写锁(2)写锁是排他的,也就是说一个写锁会阻塞其他的写锁和读锁,这是出于安全策略的考虑。 2.锁粒度(1)一种提高共享资源并发性的方式就是让锁定的对象更有选择性。尽量只锁定需要修改的部分数据,而不是所有的资源。锁定的数据量越少,则系统的并发程度越高 (2)所...

2018-12-30 16:56:17 134

原创 《编程思想》5.初始化与清理

方法重载:1. 当创建一个对象时,也就给此对象分配到的存储空间取一个名字。所谓方法则是给某个动作取的名字。通过使用名字,你可以引用所有的对象和方法2.每个重载的方法都必须有一个独一无二的参数类型列表。参数顺序的不同也足以区分两个方法。不过一般情况下别这么做,因为这会使代码难以维护。3.涉及基本类型的重载:如果传入的数据类型(实际参数类型)小于方法中声明的形式参数类型,实际数据类型就...

2018-09-20 09:53:18 112

原创 《编程思想》4.控制执行流程

逗号操作符:(注意不是逗号分隔符,逗号用作分隔符时用来分隔函数的不同参数),Java里唯一用到逗号操作符的地方就是for循环的控制表达式。在控制表达式的初始化和步进控制部分,可以使用一系列有逗号分隔的语句;而且那些语句均会独立执行。for(int i = 1,j=2;..) break & continuebreak强行退出循环,不执行循环中剩余的语句。而continue则...

2018-09-19 17:53:06 132

原创 《编程思想》3.操作符

1. 几乎所有的操作符都只能操作基本类型,例外的操作符是"=","=="和”!=“,这些操作符能够操作所有的对象,除此以外,String类支持"+"和"+="。 2.当编译器观察到一个String后面紧跟一个"+",而这个"+"的后面又紧跟一个非String类型的元素时,就会尝试着将这个非String类型的元素转换为String。 3.基本类型存储了实际的数值,而并非指向一

2018-09-19 16:08:10 73

原创 《编程思想》2.一切都是对象

1.数据存储寄存器: 最快的存储区,位于处理器内部。但寄存器的数量及其有限,所以寄存器根据需求进行分配 堆栈:位于随机访问存储器中,通过堆栈指针可以从处理器那里获得直接支持。堆栈指针若向下移动,则分配新的内存;若向上移动,则释放那些内存。这是一种快速有效的分配存储方法,仅次于寄存器。创建程序时,Java系统必须知道存储在堆栈内所有项的确切生命周期,以便于上下移动堆栈指针。这一约束限制了程序的...

2018-09-19 10:03:09 148

原创 《编程思想》1.对象导论

1.多态(1)当move()方法被调用时,即便忽略Bird的具体类型,也会产生正确的行为(Goose走,飞或游泳)(2)Answer : 面向对象程序设计语言使用了后期绑定的概念。当向对象发送消息时,被调用的代码直到运行时才能确定。编译器确保被调用方法的存在,并对调用参数和返回值执行类型检查,但是并不知道将被执行的确切代码。为了执行后期绑定,Java使用一小段代码来替代绝对地址调用。这...

2018-09-13 12:44:41 111

原创 springboot 学习二

注:本文资源来源:http://412887952-qq-com.iteye.com      基本看了一下,做了个目录方便以后使用查找 一.Spring Boot – 启动彩蛋1.启动时出现文字2.http://412887952-qq-com.iteye.com/blog/2317365二.Spring Boot 1.4单元测试1.那么在1.4中SpringAppl...

2018-08-19 21:48:22 82

原创 代码规范小结

一.编码规约(二) 常量定义1.常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。2.不要使用一个常量类维护所有常量,按常量功能进行归类,分开维护,分类:缓存相关常量放在类 CacheConsts 下 ; 系统配置相关常量放在类 ConfigConsts 下。3.long 或者 Long 初始赋值时,使用大写的 L ,不能是小写的 l ,小写容易跟数字 1 ...

2018-08-19 09:45:47 931

原创 RabbitMQ高级整合应用

一.RabbitMQ整合Spring AMQP1.RabbitAdmin(1)RabbitAdmin类可以很好的操作RabbitMQ,在Spring中直接进行注入即可(2)autoStartup必须设置true,否则Spring容器不会加载RabbitAdmin类(3)RabbitAdmin底层实现就是从Spring容器中获取Exchagge,Bingding,RoutingK...

2018-08-13 00:02:43 4127

空空如也

空空如也

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

TA关注的人

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