java
文章平均质量分 80
_elvan
路虽远,行则将至,事虽难,做则必成
展开
-
设计模式二十四:访问者模式(Visitor Pattern)
用于将数据结构与数据操作分离,使得可以在不修改数据结构的情况下,定义新的操作。访问者模式的核心思想是,将数据结构和操作进行解耦,从而使得新增操作时不必修改数据结构,只需添加新的访问者。主要目的是在不改变数据结构的情况下,为数据结构中的元素添加新的操作,从而满足开闭原则(对扩展开放,对修改封闭)原创 2023-08-25 17:39:31 · 848 阅读 · 0 评论 -
设计模式二十三:模板方法模式(Template Method Pattern)
定义了一个算法的框架,将算法的具体步骤延迟到子类中实现。这样可以在不改变算法结构的情况下,允许子类重写算法的特定步骤以满足自己的需求。原创 2023-08-24 18:54:53 · 1606 阅读 · 0 评论 -
设计模式二十二:策略模式(Strategy Pattern)
定义一系列算法,将每个算法封装成独立的对象,并使这些对象可互相替换。这使得在运行时可以动态地选择算法,而不必改变使用算法的客户端代码。策略模式的主要目标是将算法的定义与使用分离,使得客户端可以根据需要灵活地选择和切换不同的算法,而不影响到客户端代码的稳定性。原创 2023-08-23 18:02:10 · 784 阅读 · 0 评论 -
设计模式二十一:状态模式(State Pattern)
一个对象的内部状态发生变化时,允许对象改变其行为。这种模式使得一个对象看起来好像在运行时改变了它的类,主要目的是将状态的行为从主要对象中分离出来,使得主要对象不必包含所有状态的逻辑,而是将每个状态的行为封装在独立的类中。这有助于减少代码的重复,提高代码的可维护性和可扩展性。原创 2023-08-22 17:57:03 · 1286 阅读 · 1 评论 -
设计模式二十:观察者模式(Observer Pattern)
定义了一种一对多的依赖关系,允许多个观察者(也称为订阅者)对象同时监听一个主题对象,当主题对象发生变化时,所有依赖于它的观察者都会收到通知并自动更新。原创 2023-08-21 18:35:13 · 1101 阅读 · 0 评论 -
设计模式十九:备忘录模式(Memento Pattern)
备忘录模式是一种行为型设计模式,它允许对象在不暴露其内部状态的情况下捕获和恢复其状态。该模式的主要目标是在不破坏封装性的前提下,实现对象状态的备份和恢复。备忘录模式常用于需要保存对象历史状态、撤销操作或者实现快照功能的情况。原创 2023-08-18 17:55:15 · 547 阅读 · 0 评论 -
设计模式十八:中介者模式(Mediator Pattern)
在中介者模式中,多个对象之间不再直接相互通信,而是通过一个中介者对象进行通信。这可以减少对象之间的依赖关系,使系统更加模块化。中介者模式适用于当对象之间的通信逻辑变得复杂,导致代码难以维护和理解时。原创 2023-08-17 18:14:23 · 446 阅读 · 0 评论 -
设计模式十七:迭代器模式(Iterator Pattern)
迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供了一种访问聚合对象(例如列表、集合、数组等)中各个元素的方法,而无需暴露其内部表示。迭代器模式将遍历元素和访问元素的责任分离开来,使得代码更加灵活、可扩展和易于维护。迭代器模式的核心思想是抽象出一个迭代器接口,该接口定义了访问和遍历元素的方法,然后不同的聚合对象实现这个接口以提供自己的迭代器。这样,客户端代码就可以通过迭代器遍历聚合对象中的元素,而无需关心聚合对象的具体实现细节。原创 2023-08-16 18:31:44 · 812 阅读 · 0 评论 -
设计模式十六:解释器模式(Interpreter Pattern)
解释器模式是一种行为型设计模式,它用于定义一个语言的文法规则,并且通过解释器来解释执行这些语言中的句子。这种模式通常用于处理一些特定领域的语言,例如编译器、解析器、正则表达式等,解释器模式的核心思想是将一个语言表达式表示为一个抽象语法树(AST),然后通过解释器来逐步解释和执行这个语法树。原创 2023-08-15 18:53:27 · 551 阅读 · 0 评论 -
设计模式十五:命令模式(Command Pattern)
命令模式(Command Pattern)是一种行为型设计模式,它旨在将请求或操作封装成一个对象,从而允许你将不同的请求参数化,并且能够在不同的时间点执行或者队列化这些请求。这种模式使得请求发送者与接收者之间解耦,同时也支持撤销操作和日志记录。原创 2023-08-15 11:20:50 · 1200 阅读 · 0 评论 -
设计模式十四:责任链模式(Chain of Responsibility Pattern)
责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许你将请求沿着处理者链进行传递,直到有一个处理者能够处理该请求。在责任链模式中,多个处理者对象被连接成一个链。当接收到一个请求时,每个处理者会判断自己是否有能力来处理该请求,如果可以处理则直接处理,如果不能处理,则将请求传递给链中的下一个处理者。这样,请求就会依次经过整个链,直到找到一个合适的处理者处理请求或者请求到达链的末端仍然没有处理者能够处理。原创 2023-08-10 18:32:01 · 1178 阅读 · 0 评论 -
设计模式十三:代理(Proxy Pattern)
代理模式是一种结构型设计模式,它允许通过在对象和其真实服务之间添加一个代理对象来控制对该对象的访问。代理对象充当了客户端和真实服务对象之间的中介,并提供了额外的功能,如远程访问、延迟加载、访问控制等。原创 2023-08-09 18:15:40 · 552 阅读 · 0 评论 -
设计模式十二:享元模式(Flyweight Pattern)
当我们需要创建大量相似对象时,享元模式可以帮助我们节省内存空间和提高性能。该模式通过共享相同的数据来减少对象的数量。在享元模式中,有两种类型的对象:享元(Flyweight)和非享元(Unshared Flyweight)。享元对象是可共享的,它包含内部状态和外部状态。内部状态是不变的,它可以在多个对象之间共享。外部状态是会变化的,它由客户端代码传递给享元对象,因此它不能被共享。享元模式的核心思想是将相同的外部状态提取出来作为共享对象,在使用时通过传递外部状态进行对象的定制。原创 2023-08-08 19:18:27 · 731 阅读 · 0 评论 -
设计模式十一:外观模式(Facade Pattern)
外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口,用于访问系统中的一组复杂子系统。外观模式通过将复杂子系统的接口封装在一个高层接口中,简化了客户端与子系统之间的交互,使得客户端代码更加清晰、简洁。原创 2023-08-07 18:34:14 · 861 阅读 · 0 评论 -
设计模式十:装饰器(Decorator)
现实生活中,常常需要对现有产品增加新的功能或美化其外观,如房子装修、相片加相框等,都是装饰器模式装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许在运行时为对象动态地添加额外的行为或功能,而无需修改原始类的代码。该模式通过创建一个包装器,即装饰器,来包裹原始对象,并以透明的方式扩展其功能。装饰器和原始对象都实现了相同的接口,这使得它们可以互相替代使用。原创 2023-08-04 17:22:07 · 609 阅读 · 0 评论 -
设计模式九:组合模式(Composite Pattern)
组合模式是一种结构型设计模式,它允许我们将对象组合成树形结构来表示“整体-部分”层次关系。组合模式使得用户可以以相同的方式处理单个对象和组合对象。在组合模式中,有两种主要类型的对象:叶子对象和组合对象。叶子对象代表树结构中的最终节点,它们没有子节点。而组合对象代表树结构中的中间节点,它们可以包含子节点。通过使用组合模式,我们可以创建具有的对象,并且可以递归地处理这些对象。这种递归性质使得组合模式非常适用于处理树状数据结构,例如文件系统、组织架构等。原创 2023-08-03 18:41:34 · 852 阅读 · 0 评论 -
设计模式八:桥接模式(Bridge Pattern)
桥接模式是一种结构型设计模式,用于将抽象与实现分离,使它们可以独立地变化。桥接模式的核心思想是将一个大类或多个紧密相关的类分为两个独立的层次结构,从而实现解耦。在桥接模式中,存在:抽象部分和实现部分。抽象部分定义了高层逻辑,而实现部分则提供了底层的具体实现。通过将这两个部分分离,并使用桥接模式连接它们,可以在不修改现有代码的情况下方便地扩展和修改系统。原创 2023-08-02 19:20:27 · 852 阅读 · 0 评论 -
消息队列的使用场景以及优缺点
消息队列是一种在应用系统之间传递消息的通信模式。它允许发送者将消息发布到一个队列中,而接收者则从队列中获取消息进行处理。原创 2023-08-01 18:44:47 · 542 阅读 · 0 评论 -
设计模式七:适配器模式(Adapter Pattern)
适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成客户端所期望的另一个接口。它允许不兼容的接口能够协同工作。原创 2023-08-01 12:33:28 · 452 阅读 · 0 评论 -
如何解决单例数量太多占用内存的问题
当单例数量太多导致占用过多内存时,可以考虑以下几种方式来解决这个问题:原创 2023-07-31 20:13:20 · 448 阅读 · 0 评论 -
设计模式六:原型模式(Prototype Pattern)
原型模式是一种创建对象的设计模式。它允许我们通过复制一个现有对象来创建新的对象,而无需知道其具体实现细节。在使用原型模式时,我们首先创建一个原始对象,然后根据需要复制该对象,以获得新创建的对象。原型模式的主要思想是基于对象的复制。通过使用原型模式,我们可以避免直接实例化对象,从而提高性能和代码灵活性。此外,原型模式还可以用于创建复杂的对象结构,因为它允许我们在创建对象时使用已经存在的对象作为蓝图。原创 2023-07-31 20:01:58 · 684 阅读 · 0 评论 -
springboot和springcloud的联系与区别
Spring Boot是一个用于简化Spring应用程序开发的框架。它提供了一种约定优于配置的方式,通过自动配置和快速开发能力,可以快速搭建独立运行、生产级别的Spring应用程序。在传统的Spring应用程序开发中,需要手动配置多个组件、解决各种依赖关系,并且需要编写大量的样板代码。而Spring Boot的出现解决了这些问题,它通过默认配置和自动装配,让开发者可以更加专注于业务逻辑的实现,而不需要花费过多的精力在配置上。原创 2023-07-31 19:23:24 · 777 阅读 · 0 评论 -
设计模式五:建造者模式(Builder Pattern)
建造者模式(Builder Pattern)是一种创建型设计模式,用于通过一系列步骤来构建复杂对象。它将对象的构建过程与其表示分离,从而允许相同的构建过程可以创建不同的表示。原创 2023-07-28 17:02:15 · 597 阅读 · 0 评论 -
设计模式四:单例模式(Singleton)
单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。要实现这一点,可以从客户端对其进行实例化开始。因此需要用一种只允许生成对象类的唯一实例的机制,“阻止”所有想要生成对象的访问。使用工厂方法来限制实例化过程。这个方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义。原创 2023-07-27 18:06:55 · 1106 阅读 · 0 评论 -
设计模式三:抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种方式来创建一系列相关或相互依赖的对象,而无需指定具体实现类。在软件开发中,有时候需要根据不同的条件或环境来创建一组相关的对象。抽象工厂模式将对象的创建逻辑封装在一个抽象工厂接口中,该接口声明了一系列用于创建不同类型对象的方法。具体的工厂类实现了这个接口,每个具体工厂类负责创建一组相关的对象。原创 2023-07-26 18:23:51 · 659 阅读 · 0 评论 -
设计模式二:工厂方法模式(Factory Method Pattern)
工厂模式是一种创建型设计模式,它提供了一种通过抽象工厂来创建对象的方式。在工厂模式中,我们定义一个接口或抽象类作为工厂,该工厂有多个具体的实现类。每个具体工厂类都负责创建不同类型的对象。原创 2023-07-25 15:27:14 · 271 阅读 · 0 评论 -
设计模式一:简单工厂模式(Simple Factory Pattern)
简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它提供了一个通用的接口来创建各种不同类型的对象,而无需直接暴露对象的创建逻辑给客户端。原创 2023-07-25 15:25:35 · 391 阅读 · 0 评论 -
开发原则六:迪米特法则LOD
一个对象应该对其他对象有限的了解,只与直接朋友进行通信。直接朋友包括以下几类:该对象本身以参数形式传入到该对象方法中的对象该对象所创建的对象该对象的成员变量引用的对象根据迪米特法则,当我们设计一个对象时,应该尽量避免让该对象调用非直接朋友的方法。这样可以降低类之间的依赖关系,提高系统的可维护性和灵活性。原创 2023-07-20 18:17:20 · 119 阅读 · 0 评论 -
开发原则五:接口隔离ISP
在软件工程领域,接口隔离原则(ISP)规定不应强迫客户端依赖它不使用的方法。ISP将非常大的接口拆分为更小和更具体的接口,以便客户端只需知道它们感兴趣的方法。这种缩小的接口也称为角色接口。ISP旨在使系统分离,从而更容易重构,更改和重新部署。ISP是面向对象设计的五个SOLID原则之一,类似于GRASP的高内聚原则。原创 2023-07-19 17:33:28 · 174 阅读 · 0 评论 -
开发原则四:依赖倒置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 · 152 阅读 · 0 评论 -
开发原则三:里氏替换原则LSP
里氏替换原则(Liskov Substitution Principle)是面向对象设计的一个基本原则之一,它由《面向对象分析与设计》一书的作者Barbara Liskov教授在1987年提出。原创 2023-07-17 18:58:45 · 150 阅读 · 0 评论 -
自定义一个注解
1.定义一个注解类/*** 自定义一个改变缓存的注解//改变数值 int changeValue() default 11;@Inherited:Java中的一个元注解(即可以用于注解其他注解的注解),用于指示被标记的注解是否可以被继承。当一个类使用了被@Inherited注解标记的注解时,其子类将自动继承该注解。具体来说,如果一个类使用了被@Inherited注解标记的注解A,在创建该类的子类时,子类也会自动继承该注解A。这样,通过在基类上使用注解,我们可以确保子类也具有相同的注解信息。原创 2023-07-16 11:23:15 · 82 阅读 · 0 评论 -
Redis分布式锁的背景以及解决方案
在单机服务架构中,我们可以使用同步机制, 使得在同一时间只能有一个线程修改共享数据,例如对代码块、方法等加锁,实现多线程触发写的操作时,只有一个线程能够进入指定区域实现写操作,但在分布式架构下,这样的处理方式是不能实现跨越JVM的锁机制,这时候,就需要一个方案来解决分布式架构下的锁问题。情况2:在自动释放锁之前,任务没有执行完毕,自动释放锁对象,等到任务执行完毕之后,调用del释放锁,这时释放的是并不是自己的锁,而是其他业务的锁,导致别人的锁被释放,出现没有上锁的情况。原创 2023-03-11 11:30:25 · 174 阅读 · 0 评论 -
vue解决前后端交互时的异步问题
执行确定按钮 getFacility()方法和后面的循环还会发生异步运行 导致还得不到后端返回的数据 后面的for循环就先一步运行解决方法:在确定按钮方法外部添加async 在需要先执行的方法前添加await其原理是 当执行到await时 需要等待await执行完毕 后面的代码才能继续运行,解决了异步操作的问题。...原创 2023-03-23 14:16:53 · 1358 阅读 · 0 评论 -
String转换成Date格式
将String格式转换成Date格式进行输出reservationStartTime = new SimpleDateFormat(“yyyy-MM-dd’T’HH:mm:ss”).parse(firstDate);reservationEndTime = new SimpleDateFormat(“yyyy-MM-dd’T’HH:mm:ss”).parse(lastDate);yyyy-MM-dd’T’HH:mm:ss 是自己String的格式原始数据2020-07-14T00:00:00+08原创 2023-03-23 14:17:20 · 718 阅读 · 0 评论 -
栈,队列,数组,链表的认识和区别
栈stack,又称堆栈,它是运算受限的线性表,其限制是允许在栈的一边进行增删操作,其它位置不可。采用栈方式的元素有以下特点1.先进后出:先存储的元素,后面才能拿出来(就好比一个盛饭的容器,总是从上面先取饭)。2.栈的入口,出口都是栈的顶端位置队列它是运算受限的线性表,其限制是允许在队列的一段插入,另一端删除采用队列方式的元素有以下特点1.先进先出:先存储的元素,最先拿出来(就好比食堂买饭,先来先买,买了就走,后面来的就排在后面)2.队列的入口,出口各占一端数组数组是在内存中开辟一端原创 2023-03-23 14:15:25 · 1160 阅读 · 0 评论 -
数据类型转换 自动转换和强制转换
数据类型转换首先,什么是数据类型转换?java中要求参与运算的数据,必修要保证数据的一致性,如果数据类型不一致将发生强制类型转换。数据类型转换有两种方式自动转换(自动完成),代码不需要进行特殊处理,自动转换过来,从小范围到大范围进行转换(如果大范围到小范围,可能会丢失数据,所以为了保证数据不损耗,就从小范围转换到大范围)例如:可以定义 float i=-1;long x=1;这时候就发生了自动转换,符合数据范围小到大进行转换;但是不可以定义float foo=3.14d;这是不正确的,因原创 2023-03-23 14:17:40 · 2326 阅读 · 0 评论