自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 设计模式二十四:访问者模式(Visitor Pattern)

用于将数据结构与数据操作分离,使得可以在不修改数据结构的情况下,定义新的操作。访问者模式的核心思想是,将数据结构和操作进行解耦,从而使得新增操作时不必修改数据结构,只需添加新的访问者。主要目的是在不改变数据结构的情况下,为数据结构中的元素添加新的操作,从而满足开闭原则(对扩展开放,对修改封闭)

2023-08-25 17:39:31 833

原创 设计模式二十三:模板方法模式(Template Method Pattern)

定义了一个算法的框架,将算法的具体步骤延迟到子类中实现。这样可以在不改变算法结构的情况下,允许子类重写算法的特定步骤以满足自己的需求。

2023-08-24 18:54:53 1546

原创 设计模式二十二:策略模式(Strategy Pattern)

定义一系列算法,将每个算法封装成独立的对象,并使这些对象可互相替换。这使得在运行时可以动态地选择算法,而不必改变使用算法的客户端代码。策略模式的主要目标是将算法的定义与使用分离,使得客户端可以根据需要灵活地选择和切换不同的算法,而不影响到客户端代码的稳定性。

2023-08-23 18:02:10 774

原创 设计模式二十一:状态模式(State Pattern)

一个对象的内部状态发生变化时,允许对象改变其行为。这种模式使得一个对象看起来好像在运行时改变了它的类,主要目的是将状态的行为从主要对象中分离出来,使得主要对象不必包含所有状态的逻辑,而是将每个状态的行为封装在独立的类中。这有助于减少代码的重复,提高代码的可维护性和可扩展性。

2023-08-22 17:57:03 1231 1

原创 设计模式二十:观察者模式(Observer Pattern)

定义了一种一对多的依赖关系,允许多个观察者(也称为订阅者)对象同时监听一个主题对象,当主题对象发生变化时,所有依赖于它的观察者都会收到通知并自动更新。

2023-08-21 18:35:13 1082

原创 设计模式十九:备忘录模式(Memento Pattern)

备忘录模式是一种行为型设计模式,它允许对象在不暴露其内部状态的情况下捕获和恢复其状态。该模式的主要目标是在不破坏封装性的前提下,实现对象状态的备份和恢复。备忘录模式常用于需要保存对象历史状态、撤销操作或者实现快照功能的情况。

2023-08-18 17:55:15 510

原创 设计模式十八:中介者模式(Mediator Pattern)

在中介者模式中,多个对象之间不再直接相互通信,而是通过一个中介者对象进行通信。这可以减少对象之间的依赖关系,使系统更加模块化。中介者模式适用于当对象之间的通信逻辑变得复杂,导致代码难以维护和理解时。

2023-08-17 18:14:23 423

原创 设计模式十七:迭代器模式(Iterator Pattern)

迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供了一种访问聚合对象(例如列表、集合、数组等)中各个元素的方法,而无需暴露其内部表示。迭代器模式将遍历元素和访问元素的责任分离开来,使得代码更加灵活、可扩展和易于维护。迭代器模式的核心思想是抽象出一个迭代器接口,该接口定义了访问和遍历元素的方法,然后不同的聚合对象实现这个接口以提供自己的迭代器。这样,客户端代码就可以通过迭代器遍历聚合对象中的元素,而无需关心聚合对象的具体实现细节。

2023-08-16 18:31:44 768

原创 设计模式十六:解释器模式(Interpreter Pattern)

解释器模式是一种行为型设计模式,它用于定义一个语言的文法规则,并且通过解释器来解释执行这些语言中的句子。这种模式通常用于处理一些特定领域的语言,例如编译器、解析器、正则表达式等,解释器模式的核心思想是将一个语言表达式表示为一个抽象语法树(AST),然后通过解释器来逐步解释和执行这个语法树。

2023-08-15 18:53:27 527

原创 设计模式十五:命令模式(Command Pattern)

命令模式(Command Pattern)是一种行为型设计模式,它旨在将请求或操作封装成一个对象,从而允许你将不同的请求参数化,并且能够在不同的时间点执行或者队列化这些请求。这种模式使得请求发送者与接收者之间解耦,同时也支持撤销操作和日志记录。

2023-08-15 11:20:50 1162

原创 设计模式十四:责任链模式(Chain of Responsibility Pattern)

责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许你将请求沿着处理者链进行传递,直到有一个处理者能够处理该请求。在责任链模式中,多个处理者对象被连接成一个链。当接收到一个请求时,每个处理者会判断自己是否有能力来处理该请求,如果可以处理则直接处理,如果不能处理,则将请求传递给链中的下一个处理者。这样,请求就会依次经过整个链,直到找到一个合适的处理者处理请求或者请求到达链的末端仍然没有处理者能够处理。

2023-08-10 18:32:01 1136

原创 设计模式十三:代理(Proxy Pattern)

代理模式是一种结构型设计模式,它允许通过在对象和其真实服务之间添加一个代理对象来控制对该对象的访问。代理对象充当了客户端和真实服务对象之间的中介,并提供了额外的功能,如远程访问、延迟加载、访问控制等。

2023-08-09 18:15:40 540

原创 设计模式十二:享元模式(Flyweight Pattern)

当我们需要创建大量相似对象时,享元模式可以帮助我们节省内存空间和提高性能。该模式通过共享相同的数据来减少对象的数量。在享元模式中,有两种类型的对象:享元(Flyweight)和非享元(Unshared Flyweight)。享元对象是可共享的,它包含内部状态和外部状态。内部状态是不变的,它可以在多个对象之间共享。外部状态是会变化的,它由客户端代码传递给享元对象,因此它不能被共享。享元模式的核心思想是将相同的外部状态提取出来作为共享对象,在使用时通过传递外部状态进行对象的定制。

2023-08-08 19:18:27 683

原创 设计模式十一:外观模式(Facade Pattern)

外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口,用于访问系统中的一组复杂子系统。外观模式通过将复杂子系统的接口封装在一个高层接口中,简化了客户端与子系统之间的交互,使得客户端代码更加清晰、简洁。

2023-08-07 18:34:14 847

原创 设计模式十:装饰器(Decorator)

现实生活中,常常需要对现有产品增加新的功能或美化其外观,如房子装修、相片加相框等,都是装饰器模式装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许在运行时为对象动态地添加额外的行为或功能,而无需修改原始类的代码。该模式通过创建一个包装器,即装饰器,来包裹原始对象,并以透明的方式扩展其功能。装饰器和原始对象都实现了相同的接口,这使得它们可以互相替代使用。

2023-08-04 17:22:07 547

原创 设计模式九:组合模式(Composite Pattern)

组合模式是一种结构型设计模式,它允许我们将对象组合成树形结构来表示“整体-部分”层次关系。组合模式使得用户可以以相同的方式处理单个对象和组合对象。在组合模式中,有两种主要类型的对象:叶子对象和组合对象。叶子对象代表树结构中的最终节点,它们没有子节点。而组合对象代表树结构中的中间节点,它们可以包含子节点。通过使用组合模式,我们可以创建具有的对象,并且可以递归地处理这些对象。这种递归性质使得组合模式非常适用于处理树状数据结构,例如文件系统、组织架构等。

2023-08-03 18:41:34 796

原创 设计模式八:桥接模式(Bridge Pattern)

桥接模式是一种结构型设计模式,用于将抽象与实现分离,使它们可以独立地变化。桥接模式的核心思想是将一个大类或多个紧密相关的类分为两个独立的层次结构,从而实现解耦。在桥接模式中,存在:抽象部分和实现部分。抽象部分定义了高层逻辑,而实现部分则提供了底层的具体实现。通过将这两个部分分离,并使用桥接模式连接它们,可以在不修改现有代码的情况下方便地扩展和修改系统。

2023-08-02 19:20:27 806

原创 消息队列的使用场景以及优缺点

消息队列是一种在应用系统之间传递消息的通信模式。它允许发送者将消息发布到一个队列中,而接收者则从队列中获取消息进行处理。

2023-08-01 18:44:47 472

原创 设计模式七:适配器模式(Adapter Pattern)

适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成客户端所期望的另一个接口。它允许不兼容的接口能够协同工作。

2023-08-01 12:33:28 439

原创 如何解决单例数量太多占用内存的问题

当单例数量太多导致占用过多内存时,可以考虑以下几种方式来解决这个问题:

2023-07-31 20:13:20 383

原创 设计模式六:原型模式(Prototype Pattern)

原型模式是一种创建对象的设计模式。它允许我们通过复制一个现有对象来创建新的对象,而无需知道其具体实现细节。在使用原型模式时,我们首先创建一个原始对象,然后根据需要复制该对象,以获得新创建的对象。原型模式的主要思想是基于对象的复制。通过使用原型模式,我们可以避免直接实例化对象,从而提高性能和代码灵活性。此外,原型模式还可以用于创建复杂的对象结构,因为它允许我们在创建对象时使用已经存在的对象作为蓝图。

2023-07-31 20:01:58 637

原创 springboot和springcloud的联系与区别

Spring Boot是一个用于简化Spring应用程序开发的框架。它提供了一种约定优于配置的方式,通过自动配置和快速开发能力,可以快速搭建独立运行、生产级别的Spring应用程序。在传统的Spring应用程序开发中,需要手动配置多个组件、解决各种依赖关系,并且需要编写大量的样板代码。而Spring Boot的出现解决了这些问题,它通过默认配置和自动装配,让开发者可以更加专注于业务逻辑的实现,而不需要花费过多的精力在配置上。

2023-07-31 19:23:24 667

原创 设计模式五:建造者模式(Builder Pattern)

建造者模式(Builder Pattern)是一种创建型设计模式,用于通过一系列步骤来构建复杂对象。它将对象的构建过程与其表示分离,从而允许相同的构建过程可以创建不同的表示。

2023-07-28 17:02:15 565

原创 设计模式四:单例模式(Singleton)

单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。要实现这一点,可以从客户端对其进行实例化开始。因此需要用一种只允许生成对象类的唯一实例的机制,“阻止”所有想要生成对象的访问。使用工厂方法来限制实例化过程。这个方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义。

2023-07-27 18:06:55 1063

原创 设计模式三:抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种方式来创建一系列相关或相互依赖的对象,而无需指定具体实现类。在软件开发中,有时候需要根据不同的条件或环境来创建一组相关的对象。抽象工厂模式将对象的创建逻辑封装在一个抽象工厂接口中,该接口声明了一系列用于创建不同类型对象的方法。具体的工厂类实现了这个接口,每个具体工厂类负责创建一组相关的对象。

2023-07-26 18:23:51 625

原创 设计模式二:工厂方法模式(Factory Method Pattern)

工厂模式是一种创建型设计模式,它提供了一种通过抽象工厂来创建对象的方式。在工厂模式中,我们定义一个接口或抽象类作为工厂,该工厂有多个具体的实现类。每个具体工厂类都负责创建不同类型的对象。

2023-07-25 15:27:14 257

原创 设计模式一:简单工厂模式(Simple Factory Pattern)

简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它提供了一个通用的接口来创建各种不同类型的对象,而无需直接暴露对象的创建逻辑给客户端。

2023-07-25 15:25:35 372

原创 开发原则六:迪米特法则LOD

一个对象应该对其他对象有限的了解,只与直接朋友进行通信。直接朋友包括以下几类:该对象本身以参数形式传入到该对象方法中的对象该对象所创建的对象该对象的成员变量引用的对象根据迪米特法则,当我们设计一个对象时,应该尽量避免让该对象调用非直接朋友的方法。这样可以降低类之间的依赖关系,提高系统的可维护性和灵活性。

2023-07-20 18:17:20 100

原创 开发原则五:接口隔离ISP

在软件工程领域,接口隔离原则(ISP)规定不应强迫客户端依赖它不使用的方法。ISP将非常大的接口拆分为更小和更具体的接口,以便客户端只需知道它们感兴趣的方法。这种缩小的接口也称为角色接口。ISP旨在使系统分离,从而更容易重构,更改和重新部署。ISP是面向对象设计的五个SOLID原则之一,类似于GRASP的高内聚原则。

2023-07-19 17:33:28 124

原创 开发原则四:依赖倒置DIP

依赖倒置原则是Robert C. Martin在1996年为“C++Reporter”所写的专栏Engineering Notebook的第三篇,后来加入到他在2002年出版的经典著作“Agile Software Development, Principles,Parrerns,and Practices”一书中。依赖倒置原则(Dependency Inversion Principle,简称DIP)是面向对象设计的一个重要原则,它提倡抽象不应该依赖于具体实现,而是应该依赖于抽象。

2023-07-18 18:53:49 117

原创 开发原则三:里氏替换原则LSP

里氏替换原则(Liskov Substitution Principle)是面向对象设计的一个基本原则之一,它由《面向对象分析与设计》一书的作者Barbara Liskov教授在1987年提出。

2023-07-17 18:58:45 98

原创 自定义一个注解

1.定义一个注解类/*** 自定义一个改变缓存的注解//改变数值 int changeValue() default 11;@Inherited:Java中的一个元注解(即可以用于注解其他注解的注解),用于指示被标记的注解是否可以被继承。当一个类使用了被@Inherited注解标记的注解时,其子类将自动继承该注解。具体来说,如果一个类使用了被@Inherited注解标记的注解A,在创建该类的子类时,子类也会自动继承该注解A。这样,通过在基类上使用注解,我们可以确保子类也具有相同的注解信息。

2023-07-16 11:23:15 54

原创 开发原则二:单一职责SRP

单一职责原则(Single Responsibility Principle,SRP)又称单一功能原则,由罗伯特·C.马丁(Robert C. Martin)于《敏捷软件开发:原则、模式和实践》一书中提出的。这里的职责是指类变化的原因,单一职责原则规定一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分(There should never be more than one reason for a class to change)单一职责原则是 OOP 的一个基本原则,它指出一个类应该只有一个职责。

2023-07-15 16:46:20 69

原创 开发原则一:开闭原则OCP

需求总是变化”、“世界上没有一个软件是不变的”。这里投射出的意思是:需求总是变化的, 可是对于软件设计者来说, 如何才能做到不对原有系统修改的前提下, 实现灵活的扩展. 这就是开闭原则要实现的.我们在设计系统的时候, 不可能设想一次性把需求确定后, 后面就不改变了.这不科学也不现实的. 既然需求是一定会变化的, 那么我们要如何优雅的面对这种变化呢?如何设计可以使软件相对容易修改, 不至于需求一变, 就要把整个程序推到重来?开闭原则的定义是:“软件实体(类、模块、函数等)应该对扩展开放,对修改关闭”。

2023-07-15 10:50:55 67

原创 Nacos 实现可靠的限流策略

相比于基于 RateLimiter 的 Guava 实现方案,Nacos 的 Flow Control 插件具有更高的精度和更完善的功能,特别是在集群环境中使用时,可以通过全局配置或针对单个服务实例的配置灵活地控制流量。总之,Nacos 的流量管理插件提供了一种非常灵活可靠的限流策略实现方式,弥补了基于 Guava RateLimiter 的某些不足之处,并为分布式系统中的流量控制场景提供了高效、精确的解决方案。Nacos 的流量管理插件还支持对服务提供者暴露的每个具体的 RPC 接口进行限流控制。

2023-06-20 09:45:31 1183

原创 redis快的秘诀--rehash

原理:把一次大的数据拷贝移动,分配到很多次处理请求中来如下:把表1的数据移动到表2,第一次客户端请求就移动第一个位置的元素计算位置并移动到第二张大表,每一步rehash结束,都要增加索引值

2023-05-22 08:17:07 83

原创 剖析HashSet和TreeSet

特点:无序,不重复底层存储:hashMap,操作的时间上时hashMap的key,其value的值固定为PRESENT判断两个元素重复的依据:hashcode和equals两个元素hash值冲突时存储方式:与hashMap一样,转链表加红黑树特点:有序,不重复,tree=有序,set=不重复,map=键值对,hash=哈希,按照这个来准没错底层存储:treeMap,操作的是treeMap的key,其value的值固定为PRESENTComparable。

2023-05-18 09:02:37 407

原创 剖析ArrayList和LinkList

一般情况下,LinkedList的占用空间更大,因为每个节点要维护指向前后地址的两个节点,但也不是绝对,如果刚好数据量超过ArrayList默认的临时值时,ArrayList占用的空间也是不小的,因为扩容的原因会浪费将近原来数组一半的容量,不过,因为ArrayList的数组变量是用transient关键字修饰的,如果集合本身需要做序列化操作的话,ArrayList这部分多余的空间不会被序列化。而ArrayList的底层由于是数组,所以他的内存空间是连续的,在查询时,可以根据下标直接查询对应位置的地址数。

2023-05-16 11:32:08 129

原创 ==和equals的区别,以及如何重写equals方法

/无参构造 public Person() {return age;} //重写equals方法 @Override public boolean equals(Object obj) {//判断内存地址 if(obj == this) {} //判断是否是同一类型的对象 if(obj instanceof Person) {//强制转换成Person类型 Person per =(Person) obj;//判断他们的属性值 注:这里的age为什么要用==?

2023-05-12 17:21:56 32

原创 为什么要使用ElasticSearch?

基于Lucene构建的开源、分布式、RESTful接口的全文搜索引擎分布式文档数据库,其中每个字段均可被索引,而且每个字段的数据均可被搜索、横向扩展至数以百计的服务器存储以及处理PB级的数据极短的时间内存储、搜索和分析大量的数据。

2023-05-07 11:51:20 627

空空如也

空空如也

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

TA关注的人

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