自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 通俗易懂的观察者模式

观察者模式定义了对象之间的一对多依赖,让多个观察者同时监听某个主题对象,当主体对象发生变化时,它的所有观察者都会收到响应的通知。基于JDK对观察者模式提供的支持,下面举个观察者模式的例子。

2023-03-20 15:06:34 118 2

原创 Java随机生成字符串的4种方式

Apache Commons Lang库有一个org.apache.commons.lang.RandomStringUtils类,该类具有生成固定长度的随机字符串的方法。java.util.UUID 类可用于生成UUID, 它的static randomUUID方法返回一个32个字符的字符串。此方法与Math方法类似,即创建所有字符的超集,生成一个随机索引,并使用该索引处的字符创建最终字符串。它的方法可以生成只包含字母(随机字母)、数字(随机数字)或两者(随机字母数字)的随机字符串。

2023-02-13 14:18:21 9050

原创 解释器模式

概述如上图,设计一个软件用来进行加减计算。我们第一想法就是使用工具类,提供对应的加法和减法的工具方法。//用于两个整数相加public static int add(int a,int b){ return a + b;}//用于两个整数相加public static int add(int a,int b,int c){ return a + b + c;}//用于n个整数相加public static int add(Integer ... arr) {.

2022-02-17 13:57:14 135

原创 备忘录模式(Java行为型设计模式)

概述备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原,很多软件都提供了撤销(Undo)操作,如 Word、记事本、Photoshop、IDEA等软件在编辑时按 Ctrl+Z 组合键时能撤销当前操作,使文档恢复到之前的状态;还有在 浏览器 中的后退键、数据库事务管理中的回滚操作、玩游戏时的中间结果存档功能、数据库与操作系统的备份操作、棋类游戏中的悔棋功能等都属于这类。定义:又叫快照模式,在不破坏封

2022-02-16 11:35:02 144 1

原创 访问者模式(Java行为型设计模式)

概述定义:封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下定义作用于这些元素的新的操作。结构访问者模式包含以下主要角色:* 抽象访问者(Visitor)角色:定义了对每一个元素`(Element)`访问的行为,它的参数就是可以访问的元素,它的方法个数理论上来讲与元素类个数(Element的实现类个数)是一样的,从这点不难看出,访问者模式要求元素类的个数不能改变。* 具体访问者(ConcreteVisitor)角色:给出对每一个元素类访问时所产生的具体行为。*

2022-02-15 10:35:51 189

原创 迭代器模式(Java行为型设计模式)

概述定义:提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。结构迭代器模式主要包含以下角色:* 抽象聚合(Aggregate)角色:定义存储、添加、删除聚合元素以及创建迭代器对象的接口。* 具体聚合(ConcreteAggregate)角色:实现抽象聚合类,返回一个具体迭代器的实例。* 抽象迭代器(Iterator)角色:定义访问和遍历聚合元素的接口,通常包含 hasNext()、next() 等方法。* 具体迭代器(Concretelterator)角色:实

2022-02-14 11:51:02 162

原创 中介者模式(Java行为型设计模式)

概述一般来说,同事类之间的关系是比较复杂的,多个同事类之间互相关联时,他们之间的关系会呈现为复杂的网状结构,这是一种过度耦合的架构,即不利于类的复用,也不稳定。例如在下左图中,有六个同事类对象,假如对象1发生变化,那么将会有4个对象受到影响。如果对象2发生变化,那么将会有5个对象受到影响。也就是说,同事类之间直接关联的设计是不好的。如果引入中介者模式,那么同事类之间的关系将变为星型结构,从下右图中可以看到,任何一个类的变动,只会影响的类本身,以及中介者,这样就减小了系统的耦合。一个好的设计,必定不会

2022-02-10 13:33:05 509

原创 观察者模式(Java行为型设计模式)

概述定义:又被称为发布-订阅(Publish/Subscribe)模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。结构在观察者模式中有如下角色:* Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。* ConcreteSubject:具体主题(具体被观察者),该角色将

2022-02-09 11:08:53 79

原创 状态模式(Java行为型设计模式)

概述【例】通过按钮来控制一个电梯的状态,一个电梯有开门状态,关门状态,停止状态,运行状态。每一种状态改变,都有可能要根据其他状态来更新处理。例如,如果电梯门现在处于运行时状态,就不能进行开门操作,而如果电梯门是停止状态,就可以执行开门操作。类图如下:代码如下://电梯接口public interface ILift { //电梯的4个状态 //开门状态 public final static int OPENING_STATE = 1; //关门状态.

2022-01-25 18:08:30 166

原创 责任链模式(Java行为型设计模式)

概述在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同。例如,公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同,员工必须根据自己要请假的天数去找不同的领导签名,也就是说员工必须记住每个领导的姓名、电话和地址等信息,这增加了难度。这样的例子还有很多,如找领导出差报销、生活中的“击鼓传花”游戏等。定义:又名职责链模式,为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连

2022-01-20 18:31:06 79

原创 Java命令模式(行为型设计模式)

概述日常生活中,我们出去吃饭都会遇到下面的场景。定义:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增加与管理。结构命令模式包含以下主要角色:* 抽象命令类(Command)角色: 定义命令的接口,声明执行的方法。* 具体命令(Concrete Command)角色:具体的命令,实现命令接口;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。* 实现者/接收者(Recei.

2022-01-20 18:18:12 383

原创 Java设计模式之策略模式(行为型设计模式)

概述先看下面的图片,我们去旅游选择出行模式有很多种,可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。作为一个程序猿,开发需要选择一款开发工具,当然可以进行代码开发的工具有很多,可以选择Idea进行开发,也可以使用eclipse进行开发,也可以使用其他的一些开发工具。定义:​ 该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的...

2022-01-17 18:19:19 92

原创 Java模板方法模式(行为型设计模式)

概述在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关。例如,去银行办理业务一般要经过以下4个流程:取号、排队、办理具体业务、对银行工作人员进行评分等,其中取号、排队和对银行工作人员进行评分的业务对每个客户是一样的,可以在父类中实现,但是办理具体业务却因人而异,它可能是存款、取款或者转账等,可以延迟到子类中实现。定义:定义一个操作中的算法骨架,而将算法的一些

2022-01-14 18:05:58 62

原创 结构型模式之享元模式

概述定义:运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销,从而提高系统资源的利用率。结构享元(Flyweight )模式中存在以下两种状态:1. 内部状态,即不会随着环境的改变而改变的可共享部分。2. 外部状态,指随环境改变而改变的不可以共享的部分。享元模式的实现要领就是区分应用中的这两种状态,并将外部状态外部化。享元模式的主要有以下角色:* 抽象享元角色(Flyweight):通常是一个接口或抽象类,在

2022-01-10 18:42:11 74

原创 结构型设计模式之组合模式

概述​ 对于这个图片肯定会非常熟悉,上图我们可以看做是一个文件系统,对于这样的结构我们称之为树形结构。在树形结构中可以通过调用某个方法来遍历整个树,当我们找到某个叶子节点后,就可以对叶子节点进行相关的操作。可以将这颗树理解成一个大的容器,容器里面包含很多的成员对象,这些成员对象即可是容器对象也可以是叶子对象。但是由于容器对象和叶子对象在功能上面的区别,使得我们在使用的过程中必须要区分容器对象和叶子对象,但是这样就会给客户带来不必要的麻烦,作为客户而已,它始终希望能够一致的对待容器对象和叶子对象。

2022-01-07 18:10:12 90

原创 Java结构型设计模式之外观模式

概述有些人可能炒过股票,但其实大部分人都不太懂,这种没有足够了解证券知识的情况下做股票是很容易亏钱的,刚开始炒股肯定都会想,如果有个懂行的帮帮手就好,其实基金就是个好帮手,支付宝里就有许多的基金,它将投资者分散的资金集中起来,交由专业的经理人进行管理,投资于股票、债券、外汇等领域,而基金投资的收益归持有者所有,管理机构收取一定比例的托管管理费用。定义:​ 又名门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关

2022-01-06 18:09:14 101

原创 结构型模式之桥接模式

概述现在有一个需求,需要创建不同的图形,并且每个图形都有可能会有不同的颜色。我们可以利用继承的方式来设计类的关系:我们可以发现有很多的类,假如我们再增加一个形状或再增加一种颜色,就需要创建更多的类。试想,在一个有多种可能会变化的维度的系统中,用继承方式会造成类爆炸,扩展起来不灵活。每次在一个维度上新增一个具体实现都要增加多个子类。为了更加灵活的设计系统,我们此时可以考虑使用桥接模式。定义:​ 将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和

2022-01-06 17:50:14 82

原创 结构型模式之装饰者模式

概述:我们先来看一个快餐店的例子。快餐店有炒面、炒饭这些快餐,可以额外附加鸡蛋、火腿、培根这些配菜,当然加配菜需要额外加钱,每个配菜的价钱通常不太一样,那么计算总价就会显得比较麻烦。类图如下:使用继承的方式存在的问题:* 扩展性不好如果要再加一种配料(火腿肠),我们就会发现需要给FriedRice和FriedNoodles分别定义一个子类。如果要新增一个快餐品类(炒河粉)的话,就需要定义更多的子类。* 产生过多的子类定义:指在不改变现有对象结构的情况下,动态地给该对象

2022-01-04 17:50:36 155

原创 结构型模式之适配器模式

概述如果去欧洲国家去旅游的话,他们的插座如下图最左边,是欧洲标准。而我们使用的插头如下图最右边的。因此我们的笔记本电脑,手机在当地不能直接充电。所以就需要一个插座转换器,转换器第1面插入当地的插座,第2面供我们充电,这样使得我们的插头在当地能使用。生活中这样的例子很多,手机充电器(将220v转换为5v的电压),读卡器等,其实就是使用到了适配器模式。定义:​ 将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。​ 适配器模式分为类适配器模式和

2021-12-31 18:02:00 77

原创 结构型模式之代理模式

概述由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。Java中的代理按照代理类生成时机不同又分为静态代理和动态代理。静态代理代理类在编译期就生成,而动态代理代理类则是在Java运行时动态生成。动态代理又有JDK代理和CGLib代理两种。结构代理(Proxy)模式分为三种角色:抽象主题(Subject)类: 通过接口或抽象类声明真实主题和代理对象实现的业务方法。 真实主题(Real Subj

2021-12-30 16:25:52 139

原创 结构型设计模式之建造者模式

概述将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。1、分离了部件的构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况。2、 由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法、装配算法的解耦,实现了更好的复用。3、 建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象。用户只需要指

2021-12-29 18:41:18 352

原创 创建型模式之原型模式

概述用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象。结构原型模式包含如下角色:* 抽象原型类:规定了具体原型对象必须实现的的 clone() 方法。* 具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。* 访问类:使用具体原型类中的 clone() 方法来复制新的对象。接口类图如下:实现原型模式的克隆分为浅克隆和深克隆。> 浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原

2021-12-28 17:42:31 72

原创 创建型设计模式之工厂模式

工厂模式需求:设计一个咖啡店点餐系统。 设计一个咖啡类(Coffee),并定义其两个子类(美式咖啡【AmericanCoffee】和拿铁咖啡 【LatteCoffee】);再设计一个咖啡店类(CoffeeStore),咖啡店具有点咖啡的功能。 具体类的设计如下:在java中,万物皆对象,这些对象都需要创建,如果创建的时候直接new该对象,就会对该对象耦合严 重,假如我们要更换对象,所有new对象的地方都需要修改一遍,这显然违背了软件设计的开闭原则。 如果我们使用工厂来生产对象,我们就只和工厂打交

2021-12-27 16:55:14 174

原创 二叉树入门

树的基本定义树是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就 是说它是根朝上,而叶朝下的。树具有以下特点:1.每个结点有零个或多个子结点;2.没有父结点的结点为根结点;3.每一个非根结点只有一个父结点;4.每个结点及其后代结点整体上可以看做是一棵树,称为当前结点的父结点的一个子树;树的相关术语结点的度: 一个结点含有的子树的个数称为该结点的度;叶结点: 度为0的结点称为叶结点,也可以叫做终端结点分支.

2021-12-24 17:49:37 5570

原创 红黑树的底层结构实现

红黑树的定义红黑树是含有红黑链接并满足以下条件的二叉查找树1、红链接均为左连接;2、没有任何一个结点同时和两条红链接相连;3、该树是完美黑色平衡的,即任意空链接到根结点的路径上的黑链接数量相同。红黑树中存储元素的结点因为每个结点都只会有一条指向自己的链接(即它的父结点指向它),我们可以在之前的Node结点中新增一个布尔类型的变量color来表示此链接的颜色。我们规定:如果指向此结点的链接是红色的,那么该变量的值为true;如果指向此结点的链接时黑色的,那么该变量的值为false.

2021-12-23 18:47:03 516

原创 数据结构与算法之索引优先队列

在前面实现的最大优先队列和最小优先队列,他们可以分别快速访问到队列中最大元素和最小元素,但是他们有一 个缺点,就是没有办法通过索引访问已存在于优先队列中的对象,并更新它们。为了实现这个目的,在优先队列的 基础上,学习一种新的数据结构,索引优先队列。接下来我们以最小索引优先队列举列。最小索引优先队列实现思路步骤一: 存储数据时,给每一个元素关联一个索引,我们用一个T[ ] items数组来保存数据元素,在insert(T t,int k)插入时,k就是 items数组的索引,元素 t 放到items数

2021-12-21 14:40:37 474

原创 利用堆的结构特性对给定的数组进行排序

前面一篇博客我介绍了Java中堆的结构特性及其代码实现,本篇分析利用堆的结构特性对给定的数组进行排序。给定一个数组: String[] arr = {"S","O","R","T","E","X","A","M","P","L","E"} 请对数组中的字符按从小到大排序。 实现步骤:1、构造堆;2、得到堆中数组1索引处元素,这个值就是最大值;3、交换数组中1索引处元素与数组中最后一个元素,此时数组中最大的值已放在了最后的位置;4、对堆进行调整,让除了最后一个元素的剩下所有元素中的

2021-12-19 11:34:28 370

原创 Java中堆的底层结构实现

堆的特性:1、它是完全二叉树,除了树的最后一层结点不需要是满的,其它的每一层从左到右都是满的,如果最后一层结点不 是满的,那么要求左满右不满。2、通常用数组来实现,将二叉树的结点按照层级顺序放入数组中,根结点在位置1,它的子结点在位置2和3,而子结点的子 结点则分别在位置4,5,6和7,以此类推。如果一个结点在数组中的索引为k,则它的父结点的索引为k/2,它的左右子结点的索引分别为2k和2k+1。这样,在不使用指针的情况下,我们可以通过计算元素在数组中的索引来实现结点在树中上下移动3

2021-12-16 18:24:13 1385

原创 数据结构与算法之最小优先队列

先简单介绍一下堆的结构特性。堆的结构基于数组,堆中的元素都存储在数组中,存储元素的数组满足一下特性:1、最大的元素放在数组的1索引处2、每个结点的元素的值总是大于等于它的两个子结点处的元素值下面图可便于我们理解堆的结构这样实现的堆我们可以叫它最大堆,同样我们可以基于其反向思想实现最小堆,最小堆中数组元素须满足以下特性:1、最小的元素放在数组的1索引处2、每个结点的元素的值总是小于等于它的两个子结点处的元素值图示如下最小优先队列API设计最小优先队列代...

2021-12-16 10:28:45 846

原创 数据结构与算法之最大优先队列

普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在某些情况下,我们可能需要找出 队列中的最大值或者最小值,例如使用一个队列保存计算机的任务,一般情况下计算机的任务都是有优先级的,我 们需要在这些计算机的任务中找出优先级最高的任务先执行,执行完毕后就需要把这个任务从队列中移除。普通的 队列要完成这样的功能,需要每次遍历队列中的所有元素,比较并找出最大值,效率不是很高,这个时候,我们就 可以使用一种特殊的队列来完成这种需求,优先队列。最大优先队列堆的结构可以让我...

2021-12-12 17:19:02 592

原创 浅析Java单例设计模式,自写demo,简单易懂

单例模式特点:1、构造器私有2、在一个Java应用程序中,可保证只有一个实例对象3、只提供一个供外界调用的getInstance()方法单例模式优点:1、减少某些对象的频繁创建,降低系统开销和内存占用2、外部调用不使用new关键字,降低系统内存的使用频率3、对于特殊的类,在系统中只能存在一个实例,否则系统无法正常运行,比如Controller这里简单介绍两种实现方式饿汉式(线程安全)/** * @author: xuzhilei6656 * @create: 2

2021-12-12 15:47:51 729

空空如也

空空如也

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

TA关注的人

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