- 博客(71)
- 收藏
- 关注
原创 设计模式(十四)——行为型模式——状态模式(State)
定义:对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。应用程序中的有些对象可能会根据不同的情况做出不同的行为,我们把这种对象称为有状态的对象,而把影响对象行为的一个或多个动态变化的属性称为状态。当有状态的对象与外部事件产生互动时,其内部状态会发生改变,从而使得其行为也随之发生改变。优点:(1)状态模式将与特定状态相关的行为局部化到一个状态中,并且将不同状态的行为分割开来,满足“单一职责原则”。(2)减少对象间的相互依赖。将不同的状态引入独
2022-04-30 09:00:00
326
原创 设计模式(十三)——行为型模式——观察者模式(Observer)
定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。优点:(1)降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。(2)目标与观察者之间建立了一套触发机制。缺点:(1)目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用。(2)当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。模式的结构与实现实现观察者模式时要注意具体目标对.
2022-04-29 10:00:00
516
原创 设计模式(十五)——行为型模式——访问者模式(Visitor)
定义:将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。它将对数据的操作与数据结构进行分离,是行为类模式中最复杂的一种模式。优点:(1)扩展性好。能够在不修改对象结构中的元素的情况下,为对象结构中的元素添加新的功能。(2)复用性好。可以通过访问者来定义整个对象结构通用的功能,从而提高系统的复用程度。(3)灵活性好。访问者模式将数据结构与作用于结构上的操作解耦,使得操作集合可相对自由地演
2022-04-29 09:00:00
309
原创 设计模式(十一)——结构型模式——组合模式(Composite)
定义:又叫部分-整体模式,它是一种将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系,使用户对单个对象和组合对象具有一致的访问性。优点:(1)组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码;(2)更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”;缺点:(1)设计较复杂,客户端需要花更多时间理清类之间的层次关系;(2)不容易限制容器中的构件;(3)不容易用继承的方
2022-04-28 15:00:00
226
原创 设计模式(十二)——行为型模式——策略模式(Strategy)
定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。优点:(1)多重条件语句(比如if)不易维护,而使用策略模式可以避免使用多重条件语句。(2)策略模式提供了一系列的可供重用的算法族,恰当使用继承可以把算法族的公共代码转移到父类里面,从而避免重复的代码。(3)策略模式可以提供相同行为的不同实现,客户可以根据不同时间或空
2022-04-28 10:00:00
140
原创 设计模式(十)——结构型模式——桥接模式(Bridge)
定义:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。如果软件系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使两者可以独立扩展,让系统更加符合“单一职责原则”。优点:由于抽象与实现分离,所以扩展能力强;其实现细节对客户透明。缺点:由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,这增加了系统的理解与设计难度。结构与实现可以将抽象化部分与实现化部分分开,取消二者的继承关系,改用组合关系。
2022-04-28 08:00:00
122
原创 设计模式(九)——结构型模式——装饰模式(Decorator)
定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式。优点:(1)采用装饰模式扩展对象的功能比采用继承方式更加灵活。(2)可以设计出多个不同的具体装饰类,创造出多个不同行为的组合。缺点:(1)装饰模式增加了许多子类,如果过度使用会使程序变得很复杂。装饰模式的结构与实现通常情况下,扩展一个类的功能会使用继承方式来实现。但继承具有静态特征,耦合度高,并且随着扩展功能的增多,子类会很膨胀。如果使用组合关系来创建一个包装对象(即装饰对象)来包裹真实对象,并.
2022-04-27 10:00:00
148
原创 设计模式(八)——结构型模式——适配器模式(Adapter)
引入:笔记本电脑的工作电压是20V,而我国的家庭用电是220V,如何让20V的笔记本电脑能够在220V的电压下工作?答案是引入一个电源适配器(AC Adapter),俗称充电器或变压器,有了这个电源适配器,生活用电和笔记本电脑即可兼容定义:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。适配器模式分为类结构型模式和对象结构型模式两种,类结构型模式类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些,而且java不
2022-04-26 10:00:00
464
原创 设计模式(七)——结构型模式——代理模式(Proxy)
代理模式(Proxy)定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。目的:(1)保护目标对象(2)增强目标对象。优点:(1)代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用;(2)代理对象可以扩展目标对象的功能;(3)代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度;缺点:(1)在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢;
2022-04-25 10:00:00
366
原创 java集合详解之Vector
1 特点有序的,可以存储重复值和null值。 底层是数组实现的,线程安全。结构与ArrayList非常相似,同样是一个线性的动态可扩容数组。 初始容量是10,没有设置扩容增量的情况下以自身的2倍容量扩容,可以设置容量增量,初始容量和扩容量可以通过构造函数public Vector(int initialCapacity, int capacityIncrement)进行初始化。2 源码分析2.1 接口的定义和属性public class Vector<E> exten
2022-04-24 16:00:00
2916
原创 java集合详解之LinkedList
1 特点有序的,可以存储重复值和null值。 底层是双向链表实现的,线程不安全,在进行任何位置的增删操作花费的时间都一样,不需要搬运数据,效率高,但是在查询的时候要移动指针,查询慢,不适合查询。链表不会涉及到扩容问题。 ArrayList 对空间的消耗是要低于LinkedList,因为LinkedList要维护前后指针,还要对数据进行封装2 源码分析2.1 接口的定义和属性/** *双向链表List,实现了 List 和 Deque接口,实现了list 接口的所有操作,并且允许所有
2022-04-24 11:35:36
2453
原创 设计模式(六)——创建型模式——原型模式(Prototype)
概念:原型模式的思想是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。使用场景:主要应用与那些创建新对象的成本过大时。优点:简化了新对象的创建过程,提高了效率,同时原型模式提供了简化的创建结构。实现方式:(1)创建一个原型类,实现Cloneable接口,覆写clone方法,此处clone方法可以改成任意的名称,因为Cloneable接口是个空接口。深复制和浅复制都可以重写clone方法来实现。(2)深复制还可以通过序列化来实现。引用复制:将原对象的引用直接赋给新对象,是
2022-04-24 10:00:00
169
原创 java集合详解之ArrayList
1 特点有序的,可以存储重复值和null值。 底层是数组实现的,线程不安全。通过下标查询、速度快,非末尾增删的时候需要重新移动数据,所以增删性能低。 调用构造函数new ArrayList()时,最开始是一个空数组,在第一次add的时候会创建一个初始容量为10的数组。也可以自定义初始化容量new ArrayList(int initialCapacity)。 以自身的1.5倍容量扩容,不可以设置容量增量。2 源码分析2.1 接口的定义和属性public class ArrayList&
2022-04-23 16:18:25
7095
原创 设计模式(五)——创建型模式——建造者模式(Builder)
概念:建造者模式又名生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象。用户只需要指定复杂对象的类型就可以得到该对象,而无须知道其内部的具体构造细节。优点:(1)产品的建造和表示分离,实现了解耦。(2)隐藏了产品的建造细节,用户只需关心产品的表示,而不需要了解是如何创建产品的。(3)体现了开闭原则,如果需要再生产其他共享单车,只需要再开一条生
2022-04-23 10:00:00
175
原创 设计模式(四)——创建型模式——抽象工厂模式(Abstract Factory)
介绍:抽象工厂是围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂。提供一个相关或相互依赖对象的接口,而无需指定他们具体的类。在抽象工厂模式中,抽象产品可能是一个或多个,从而构成一个或多个产品族。在只有一个产品族的情况下,抽象工厂模式实际上退化到工厂方法模式。定义:与工厂方法模式不同的是,工厂方法模式中的工厂只生产单一的产品,而抽象工厂模式中的工厂生产多个产品。使用场景:系统的产品多于一个产品族,而系统只消费某一族的产品。优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端
2022-04-22 10:00:00
196
原创 设计模式(三)——创建型模式——工厂模式(Factory)
工厂模式(Factory)概念:封装对象的创建,为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。1、简单工程模式
2022-04-21 10:52:48
304
原创 数据结构与算法学习笔记——数据结构(七):哈希表
1 介绍散列表(Hash table,也叫哈希表),根据关键码值(Key value)而直接进行访问的数据结构。 它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。 这个映射函数叫做散列函数,存放记录的数组叫做散列表。2 分析哈希冲突:哈希表关键码值key是通过哈希函数计算得到一个值,这个key反映的是在数组上的位置,当key值相同的时候就是哈希冲突。处理哈希冲突的方式:开放寻址法:如果位置被占了,那就另外再找个位置。最基本的方法就是查看该位置的后一个位置是否可用,如果没有
2022-04-18 10:35:54
216
原创 数据结构与算法学习笔记——查找算法
1 顺序(线性)查找1.1 介绍为简单的一种,既从头到尾遍历,直到直到要查询的为止。1.2 代码实现package com.czq.algorithm.search;/** * 顺序(线性)查找 * 适合于存储结构为顺序存储或链接存储的线性表 * * @author czq * @date 2020/07/22 */public class OrderSearch { public static void main(String[] args) {
2022-04-14 11:55:28
910
原创 Mysql——高级——多版本并发控制-MVCC(九)
1、什么是MVCCMVCC (Multiversion Concurrency Control),多版本并发控制。MVCC 是通过数据行的多个版本管理来实现数据库的并发控制。这项技术使得在InnoDB的事务隔离级别下执行一致性读操作有了保证。MVCC就是为了查询一些正在被另一个事务更新的行,并且可以看到它们被更新之前的值,这样在做查询的时候就不用等待另一个事务释放锁。MVCC没有正式的标准,在不同的DBMS中MVCC的实现方式可能是不同的,这里是指InnoDB中MVCC的实现机制。2、快照读与当
2022-04-13 16:56:35
915
原创 Mysql——高级——事务日志(八)
1、事务日志事务有4种特性:原子性、一致性、隔离性和持久性。事务的隔离性由锁机制实现。而事务的原子性、一致性和持久性由事务的 redo 日志和undo 日志来保证。REDO LOG 称为重做日志,提供再写入操作,恢复提交事务修改的页操作,用来保证事务的持久性。UNDO LOG 称为回滚日志,回滚行记录到某个特定版本,用来保证事务的原子性、一致性。有的DBA或许会认为 REDO是UNDO的逆过程,其实不然。REDO和UNDO都可以视为一种恢复操作。REDO LOG:是存储引擎生成的
2022-04-12 18:27:47
1874
原创 数据结构与算法学习笔记——数据结构(四):单向环形链表(约瑟夫问题)
1、约瑟夫问题约瑟夫问题其实也是一个游戏(丢手绢),也称为约瑟夫环。规则很简单:就是有一群小鬼围起来(例5个)成一个圈,先从第一个报数 n,以第一个小鬼开始报数,后面报到第n个小鬼,既出列,出列的第 n 个小鬼的后面一个继续报数n,依次类推直到所有小鬼都离开这个圈。解决方案:可以使用单向环形链表2、思路分析2.1、单向环形链表的构建和遍历分析(1)构建一个单向的环形链表思路先创建第一个节点, 让 first 指向该节点,并形成环形后面当我们每创建一个新的节点,就.
2022-04-12 11:01:49
2945
原创 数据结构与算法学习笔记——概述
1、介绍数据结构与算法的重要性算法是程序的灵魂,优秀的程序可以在海量数据计算的时候,依然保持高速计算。一般来讲,程序使用了内存计算框架(比如Spark)和缓存技术(比如Redis)来优化程序,再深入思考一下,这些计算框架和缓存技术,它的核心功能就是数据结构与算法。 拿实际工作经历说,在Unix下开发服务器程序,功能是要支持上千万人同时在线,在上线前,进行测试都OK,可是上线后,服务器就撑不住了,公司的CTO对代码进行优化,再次上线,就坚如磐石。这是程序的灵魂——算法。数据结构和算法的关系
2022-04-08 09:48:16
141
原创 docker 详解
1 docker2 image2.1 docker images 查看本地镜像列表2.2docker image ls 查看本地镜像列表2.3docker search [image name]查询仓库中的镜像2.4docker pull [image name]从仓库中获取镜像2.5docker rmi[image name]或者[image id] 从仓库中获取镜像3 container3.1 docker run [image name]新建并启...
2021-07-29 18:32:42
6232
原创 线程池详解
1 线程池的优势降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗; 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行; 提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。 提供更强大的功能,延时定时线程池。2 线程池原理其中最核心的思想就是把宝贵的资源放到一个池子中;每次使用都从里面获取,用完之后又放回池子供其他人使用,达到重复利用的目的。其实java线程池的实现原理
2021-03-23 16:30:18
616
原创 Redis——详解
1Nosql概述2Redis入门2.1 概述Redis(Remote Dictionary Server ),即远程字典服务。是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。2.2 Redis能干什么...
2021-03-13 16:01:57
408
原创 Mysql——高级——事务和锁机制(七)
目录1 锁概述2 锁分类3 Mysql 锁3.1 MyISAM 表锁3.1.1 如何加表锁3.2 InnoDB 行锁3.2.1 事务及其ACID属性3.2.2 事务隔离级别3.2.3 InnoDB 的行锁模式3.2.4 无索引行锁升级为表锁3.2.5 间隙锁危害3.2.6 InnoDB 行锁争用情况4 总结1 锁概述锁是计算机协调多个进程或线程并发访问某一资源的机制(避免争抢)。在数据库中,除传统的计算资源(如 CPU、RAM、I/O 等)的争用以
2021-03-13 14:17:11
327
原创 Java 8 新特性
Java 8 内容(1)Lambda 表达式(2)函数式接口(3)方法引用与构造器引用(4)Stream API(5)接口中的默认方法与静态方法(6)新时间日期 API(7)其他新特性Java 8新特性简介(1)速度更快(2)代码更少(增加了新的语法 Lambda 表达式)(3)强大的 Stream API(4)便于并行(5)最大化减少空指针异常 Optional1、Lambda 表达式(1)介绍Lambda 是一个匿名函数,Lambda 表达
2021-02-23 16:09:16
198
1
原创 JUC总结详细笔记
1、juc是什么java.util.concurrent在并发编程中使用的工具类2、进程和线程(1)进程/线程是什么进程:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。线程:通常在一个进程中可以包含至少一个线程。线程可以利用进程所拥有的资源,在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程更小,基本上不拥
2021-01-26 11:10:03
1115
原创 springboot重复提交
1、什么是幂等幂等:F(F(x))=F(x) 多次运行结果相同常见幂等select查询天然幂等delete删除也是幂等,删除同一个多次效果一样update直接更新某个值的幂等update更新累加操作的,非幂等insert非幂等操作,每次新增一条2、解决思路利用拦截器统一处理请求,利用 token的唯一性和请求url 确定是否是相同请求,再放入缓存里面。package com.medrd.interceptor;import com.medrd.utils.Int
2020-12-02 14:21:57
280
原创 Mysql——高级——应用优化(六)
1、应用优化存在很多数据库的优化措施。但是在实际生产环境中,由于数据库本身的性能局限,就必须要对前台的应用进行一些优化,来降低数据库的访问压力。(1)使用连接池对于访问数据库来说,建立连接的代价是比较昂贵的,频繁的创建关闭连接,是比较耗费资源的,有必要建立数据库连接池,来提高访问的性能。(2)减少对MySQL的访问1)避免对数据进行重复检索在编写应用代码时,需要能够理清对数据库的访问逻辑。能够一次连接就获取到结果的,就不用两次连接,这样可以大大减少对数据库无用的重复请求。2)增加
2020-11-18 11:46:42
229
2
原创 Mysql——高级——SQL优化(五)
1、优化order by语句创建索引:create index idx_emp_age_salary on emp(age,salary);(1)两种排序方式1)第一种是通过对返回数据进行排序,也就是通常说的 filesort 排序,所有不是通过索引直接返回排序结果的排序都叫FileSort 排序,效率低。2)第二种通过有序索引顺序扫描直接返回有序数据,这种情况即为 using index,不需要额外排序,效率高(2)多字段排序尽量减少额外的排序,通过索引直接返回有序数据。w
2020-11-06 10:44:46
214
原创 Mysql——高级——SQL优化(四)
1、优化SQL步骤(1)查看SQL执行频率MySQL 客户端连接成功后,通过 show [session|global] status 命令可以提供服务器状态信息,也可以根据需要加上参数“session”或者“global”来显示 session 级(当前连接)的计结果和 global 级(自数据库上次启动至今)的统计结果。如果不写,默认使用参数是“session”。下面的命令显示了当前 session 中所有统计参数的值:show status like 'Com_______';.
2020-11-04 09:28:33
247
原创 Mysql SQL优化查询效率
近期在项目中遇到一个功能模块数据量稍大的地方,本地开发和测试功能都没啥问题,上了正式环境,问题就体现出来了,因为正式环境需要从第三方导入很多数据,然后正式环境的列表加载基本要几十秒甚至根本加载超时(微服务连接超过一定时间自动断开)1、第一次优化这个项目很多地方都需要和基础健康档案进行关联,开始的sql是这样的select distinct a.id,a.patient_id,a.hospital_id,a.personal_file_number,a.patient_name,a.live_t
2020-10-28 11:30:41
185
原创 Mysql——高级——存储引擎(三)
1、Mysql的体系结构概览整个MySQL Server由以下组成Connection Pool : 连接池组件 Management Services & Utilities : 管理服务和工具组件 SQL Interface : SQL接口组件 Parser : 查询分析器组件 Optimizer : 优化器组件 Caches & Buffers : 缓冲池组件 Pluggable Storage Engines : 存储引擎 File System : 文件系
2020-10-21 13:54:42
248
原创 Mysql——高级——视图、存储过程和函数、触发器(二)
1、视图(1)视图概述视图(View)是一种虚拟存在的表。视图并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表, 并且是在使用视图时动态生成的。视图就是一条SELECT语句执行后返回的结果集。所以在创建视图时,主要的工作就落在创建这条SQL查询语句上。视图相对于普通的表的优势主要有简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤 好的复合条件的结果集。安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到
2020-10-20 22:10:53
150
原创 Mysql——高级——索引(一)
1、索引概述索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。如下面的所示 :左边是数据表,最左边的是数据记录的物理地址。为了加快Col2的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找快速获取到相应数据。一般来说索引本身也很.
2020-10-07 11:27:56
231
1
原创 SpringCloud OpenFeign单文件和多文件上传
1、单文件上传OpenFeign默认不支持文件上传,需要通过引入Feign的扩展包来实现,添加依赖 <!--Feign上传文件--> <dependency> <groupId>io.github.openfeign.form</groupId> <artifactId>feign-form</artifactId> <
2020-10-02 13:51:51
2108
4
原创 MongoDB——高级——集群和安全:安全认证(八)
1、MongoDB的用户和角色权限简介默认情况下,MongoDB实例启动运行时是没有启用用户访问权限控制的,在实例本机服务器上都可以随意连接到实例进行各种操作,MongoDB不会对连接客户端进行用户验证,这是非常危险的。为了能保障mongodb的安全可以做以下几个步骤:1)使用新的端口,默认的27017端口如果一旦知道了ip就能连接上,不太安全。2)设置mongodb的网络环境,最好将mongodb部署到公司服务器内网,这样外网是访问不到的。公司内部访问使用vpn等。3)开启安全认证。认
2020-09-22 09:48:25
248
原创 MongoDB——高级——集群和安全:分片集群-Sharded Cluster(七)
1、分片概念分片(sharding)是一种跨多台机器分布数据的方法, MongoDB使用分片来支持具有非常大的数据集 和高吞吐量操作的部署。 换句话说:分片(sharding)是指将数据拆分,将其分散存在不同的机器上的过程。有时也用分区 (partitioning)来表示这个概念。将数据分散到不同的机器上,不需要功能强大的大型计算机就可以储存 更多的数据,处理更多的负载。 具有大型数据集或高吞吐量应用程序的数据库系统可以会挑战单个服务器的容量。例如,高查询率会耗 尽服务器的CPU容量。工作集大小大于系统
2020-09-18 15:05:23
476
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人