
Java设计模式和算法
文章平均质量分 62
Java设计模式和算法
weisian151
大家一起来学习,讨论
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java设计模式 _行为型模式_访问者模式
访问者模式,主要包含访问者和被访问者两种角色的实体,两者之间相互关联,被访问者依附于访问者,访问者可以访问被访问者的方法。学海无涯苦作舟!!!原创 2024-05-30 16:11:34 · 540 阅读 · 0 评论 -
Java设计模式 _行为型模式_模板模式
模板模式,模板实际上就是统一的规范,每个需要使用模板的地方都要用相同的格式去处理。放在代码中,如玩游戏,不论玩哪一种游戏,逻辑上都应该是初始化,开始,结束的三个过程,所以在定义模板方法的时候就可以在抽象类中去定义,那么以后的每一个实现类就都需要遵循这种模板规范去执行程序。就好比微信提供了开放能力接口一样是一个道理。学海无涯苦作舟!!!原创 2024-05-30 15:00:36 · 280 阅读 · 0 评论 -
Java设计模式 _行为型模式_策略模式
策略模式,常用于一种操作有多种实现的情况,就比如案例的支付,实现付款可以是微信,支付宝等多种方式,可以根据具体的情况去选择其中的一种进行实际操作。在代码实现上,每一个实现类都要有统一的规范,即实现相同的接口;之后内置到管理类中,管理类可根据情况去设置不同的实现方法,进而实现了策略的切换和管理。学海无涯苦作舟!!!原创 2024-05-30 14:28:27 · 428 阅读 · 0 评论 -
Java设计模式 _行为型模式_空对象模式
空对象模式,主要作用为防止空指针的出现。通过使用空对象来代替null的方式,避免了null可能带来的问题。学海无涯苦作舟!!!原创 2024-05-30 11:38:25 · 739 阅读 · 0 评论 -
Java设计模式 _行为型模式_状态模式
状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是允许一个对象在其内部状态改变时自动改变它的行为。(2)、编写每一种状态的实现类(开,关等),实现状态的规范。状态模式,当一个对象状态改变需要触发不同的行为操作时比较推荐使用。主要套路就是把所有状态由原来的单一字段抽成具体的类,通过设置状态类来触发对应的行为方法。实现促发行为的方法,促发修改状态的方法等。电脑的对象,调用打开方法,修改状态促发行为。(1)、定义状态类的规范(行为的方法)原创 2024-05-30 10:55:41 · 678 阅读 · 0 评论 -
Java设计模式 _行为型模式_观察者模式
观察者模式往往用于一对多的场景,主要套路为你中有我,我中有你。所以代码上要把观察者内置到被观察者的属性中(列表),被观察者也要内置到观察者中,彼此定义了对方的属性,之后封装数据可以是构造方法实现,也可以是自定义方法等。形成这种关系后,当被观察者发生改变时,就可以把被观察者的业务消息通知到内置的观察者列表中,通常是直接调用观察者的方法实现。学海无涯苦作舟!!!原创 2024-05-29 15:55:56 · 591 阅读 · 0 评论 -
Java设计模式 _行为型模式_备忘录模式
主要用来做数据的回溯,方便查询过去时刻的数据。本例实现主要通过定义的一个集合,这个集合仅包含一个对象的操作接口,所以需要内置到对象的属性中。真实开发是,数据可以是任意类型的对象,保存也可以是数据库等第三方组件,但是一定要有一个原则,就是一个操作类仅能有自己的操作数据即可。通过保存一个对象的某个状态,以便在适当的时候恢复对象。(3)、定义操作对象类,内置数据和备忘录集合,记录当前对象的数据,同时添加到备忘录中。用户可以多次操作一个数据,每次操作后的结果会改变。通过备忘录回溯之前的操作数据。原创 2024-05-29 15:04:57 · 516 阅读 · 0 评论 -
Java设计模式 _行为型模式_中介者模式
中介者模式,顾名思义,就是通过中间人的介入完成不同业务之间的解耦行为。主要特点为实体对象和中介者产生关联,消费对象也和中介者产生关联。在代码实现上,一般多通过内置对象的形式,即对象实体内包含中介对象,中介对象内包含实体对象集合等,两者之间可以通过各自的方法去添加彼此。主要通过一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。李四发送消息到聊天室,聊天室调用了张三的接收方法。(3)、定义中介类,包含实体类对象的集合。(2)、编写实现类,需要内置中介类。需要通过中介接收数据。原创 2024-05-21 14:22:06 · 492 阅读 · 0 评论 -
Java设计模式 _行为型模式_迭代器模式
迭代器模式主要用来处理数据集合,可以在不关注集合底层类型的情况下获取下一个元素或上一个元素(可以在上面的示例代码中追加规范方法进行扩展)。相对于java本身的Iterator接口来说,非常类似,使用场景目现也比较小,目前大部分的三方工具包都包含对集合的处理方法,可以了解一下。学海无涯苦作舟!!!原创 2024-05-21 09:51:48 · 532 阅读 · 0 评论 -
Java设计模式 _行为型模式_解释器模式
解释器模式一般用于定义某些新的表达式类型,如:新的运算表达式。也可以是兼容一些语法上的使用,如翻译一些脚本的功能(js,python,shell)等。比较常用的如mybatis-plus中(对象直接操作.eq,.like,.or等方法去解释成对应的sql语言去执行)。一般不同业务场景下用到的还是比较少,具体还是看业务是否需要定义新的表达式规范再来确定是否使用这种设计模式吧。学海无涯苦作舟!!!原创 2024-05-11 09:52:46 · 395 阅读 · 1 评论 -
Java设计模式 _行为型模式_命令模式
命令模式中请求以命令的形式包裹在对象中,即将命令封装为类,从而可以使用不同的请求,队列等操作具体的对象等。命令模式的主要核心就是将命令封装为业务类,通过发送者,命令,接收者三者之间的逻辑关系(发送者能创建发送命令,命令中包含接收者的属性对象),以此关系来完成某些业务场景下的业务要求。(4)、编写命令的实现类(包含接收者对象属性,实例属性的方法(构造或自定义),实现命令的方法)(5)、编写发送者类(内置封装业务的命令,用于统一控制命令的发送,类似遥控器)(1)、命令(包含:抽象和实现类)原创 2024-05-10 10:43:16 · 622 阅读 · 0 评论 -
Java设计模式 _行为型模式_责任链模式
当多个实现类都可以处理某种类型请求时,可以根据请求的条件来决定最终由哪一个类去处理这个请求,如本例的责任链模式就是一种实现方式。责任链模式的链路生成思路是通过内置了下一个对象的引用来实现的。当条件满足时直接处理业务,不满足就放给下一个接收者去处理,或者某些场景下也可以是处理完业务也放给下一个链路去处理(如:错误日志和全量日志),具体需要根据业务去改造即可。学海无涯苦作舟!!!原创 2024-05-09 16:51:36 · 562 阅读 · 0 评论 -
Java设计模式 _结构型模式_代理模式(静态,动态)
代理的作用就是在不改变原代码的同时,对原代码的功能做业务扩展。分为静态和动态两种代理方式,静态代理需要我们在开发过程中就先创建好代理的类,直接使用代理类完成原始类的功能,思路和设计也都比较简单。动态代理则是在运行时段,基于反射生成代理类的源码,主要用到了两个对象(Proxy和InvocationHandler接口),相对静态代理而言,代码编写上难度大一点,但是动态代理方式无需大量编写代理对象,如果原始类放生变动,静态代理则是比较奔溃的局面,代理类往往也需要改动,动态代理则相对改动较少。原创 2024-05-07 10:27:45 · 969 阅读 · 0 评论 -
Java设计模式 _结构型模式_享元模式
主要套路就3步,创建接口,创建实例,创建工厂。主要解决有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。享元模式通过缓冲池的思路来实现,从而减少大量相同数据的产生,这样的数据要求内部状态不易变化,如游戏中的子弹,象棋中的棋子等。一副中国象棋通常有很多棋子,每一个棋子的作用固定不发生变化,棋子存在一定的重复情况,如有多个炮,多个卒等。(3)、编写享元工厂类(缓冲池如HashMap,获取享元对象的方法,其他处理缓冲池对象的方法)原创 2024-05-06 15:48:51 · 573 阅读 · 1 评论 -
Java设计模式 _结构型模式_外观模式
当客户端与多个子系统之间存在大量的交互时,有助于减少客户端与子系统之间的耦合,提高系统的可扩展性。同时保护了子系统的内部实现,提高系统的安全性。外观模式的套路,就是将多个相关业务的类都放在一个类中,作为成员去管理。(4)、定义外观需要的各种方法,可以是调用某一个实现类的方法,或者是组合多个实现类的方法。(3)、在外观类中,通过构造方法或者自定义方法,去创建成员变量的实例。通过形状的超市去获取各种形状,而不是通过每一个形状的实例去获取。(2)、编写外观类,将各种实现类都内置为外观类的成员变量;原创 2024-05-06 11:52:04 · 565 阅读 · 0 评论 -
Java设计模式 _结构型模式_装饰器模式
装饰器模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。定义的装饰类为抽象类,需要实现原抽象类且包含原抽象类的成员属性。通过构造或者自定义的方法,将原实体对象放入装饰类的实体中,这样通过装饰类就可以获取原对象处理后的实体类。代码套路和适配器模式比较类似,适配器模式相当于对原功能的转接,装饰者模式相当于对原功能的进一步加强。(3)、定义装饰抽象类,需要实现抽象类,同时定义包含抽象类的成员属性(如:配料)(4)、定义装饰抽象类的实体类(如:珍珠,可可,椰果等)原创 2024-04-30 11:53:49 · 926 阅读 · 1 评论 -
Java设计模式 _结构型模式_组合模式
即:创建了一个包含自己对象组的类,该类提供了修改相同对象组的方式。如,总经理直接下级包含多个总监,每个总监下包含多个负责人,每个负责人下包含多个具体员工。本例仅展示了一个子节点的信息,如果需要定义兄弟节点等多个维度的信息,则需要定义多个属性实例及对应的增删方法。可以看到当完整的构建了组合模式的时候,能够根据其中的一个节点获取到相关子节点的信息。(1)、实体类中,定义包含自身对象或者自身对象集合的属性。(3)、定义展示或操作自身及孩子节点的具体业务方法。(2)、定义添加和删除自身集合属性方法。原创 2024-04-30 11:00:59 · 945 阅读 · 1 评论 -
Java设计模式 _结构型模式_过滤器模式
过滤器模式是对一组数据进行过滤,从而达到我们希望数据的设计模式。首先需要定义统一过滤方法,之后就是根据需要编写各种实现类,对需要的场景搭配不同的过滤器链路,让数据经过这些过滤器链路后获取我们需要数据的过程。过滤器,顾名思义,就是对一组数据进行过滤,从而最终获取到我们预期的数据。(3)、封装类中定义过滤器类的集合,添加过滤器到封装类中,定义和实现数据过滤的具体方法。(1)、定义过滤器的规范接口(生明接口,定义统一的过滤方法)。(2)、定义过滤器实现类,实现规范接口的过滤方法。运行结果可以看出实现了过滤效果。原创 2024-04-28 16:03:21 · 630 阅读 · 1 评论 -
Java设计模式 _结构型模式_桥接模式
(1)、定义次维度规划抽象和实例方式(支付方式为抽象(接口),密码支付,扫脸支付,指纹支付为三种实例(接口实现类))。使用桥接模式,一定要找到这个类中两个变化的维度:如支付功能中(平台类型,支付方式)或带颜色形状(形状,涂色)。(4)、在主维度抽象类中,定义次维度的抽象属性,通过构造方法实例化该属性,定义统一的抽象方法(支付方法);(3)、定义主维度抽象类和实现类(支付渠道(抽象类),微信,支付宝(抽象类的实现类))(5)、在主维度实现类中,通过自身方法和次维度属性的实现方法封装各自具体的业务方法。原创 2024-04-28 11:54:19 · 889 阅读 · 1 评论 -
Java设计模式 _结构型模式_适配器模式
编写扩展的实例类,通过注入适配器,将适配器注入原始类的方法,实现原始类可以调用自身方法或者适配器方法的多种情形。(1)、创建适配器类(Adapter),实现和业务类(Computer)相同的功能接口(Abilities)(4)、在业务类(Computer)中,注入适配器类(Adapter)的属性类,重写构造方法实例化适配器。上图可以看出,虽然实现的是电脑的实例对象,调用的确实内存卡的业务实现方法。(3)、适配器类实现功能接口(Abilities)的抽象方法,通过自身的属性类去实现调用。原创 2024-04-26 17:08:15 · 799 阅读 · 0 评论 -
Java设计模式 _创建型模式_原型模式(Cloneable)
1、原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能比较好。一般对付出较大代价获取到的实体对象进行克隆操作,可以提升性能。(2)、复写clone方法(当前对象本身可以不复写,如果当前对象被继承,需要clone子类,则必须要复写)(1)、需要克隆的实体类实现Cloneable接口。可以看出,完整的复制了属性,且并不是同一个对象。原创 2024-04-26 11:55:53 · 667 阅读 · 1 评论 -
Java设计模式 _创建型模式_建造者模式(Builder)
如上的代码示例中,在静态内部类Builder中,每一个set方法中通过return this,实现了设备值的同时,返回房前Builder对象,可以继续调用set方法,进而实现了链路设置的方式。(2)、定义静态内部类Builder,Builder类包含和实体类相同的属性,以及每个属性的set方法,以及build()方法去调用实体的构造。(3)、构建实例对象时,通过静态内部类Builder进行设值在build()进行实例对象的创建。(2)、相对于构造方法的方式,建造者模式套路更优,无需定义更多的构造方法。原创 2024-04-26 10:57:25 · 913 阅读 · 0 评论 -
Java设计模式 _创建型模式_单例模式(懒汉式,饿汉式)
一个类负责创建自己的对象,同时确保只有1个对象被创建,这个类提供了一种访问其唯一的对象的方式,不需要在实例化该类的对象。存在问题:会在类装载的时候就占用一定的内存空间,如果该类的方法没有用到,就造成一定的内存浪费。(3)、提供public的方法获取实例对象(如果有实例直接返回,没有实例,创建实例后在返回)特点:先不创建该类的实例,在获取实例的方法中,根据判断,如果不存在才生成和返回。特点:在加载这个类的时候就创建了这个类的实例,在获取的方法中直接返回。(1)、该类中定义该类的实例属性,私有化。原创 2024-04-26 09:50:45 · 753 阅读 · 1 评论 -
Java设计模式 _创建型模式_工厂模式(普通工厂和抽象工厂)
但是普通工厂模式违反了单一职责的原则(一个类只干一种事情),且随着花的实例品种越来越多,每一次都要修改工厂类才能添加新的花品种,相对而言是改动是比较大的也比较麻烦的。抽象工厂模式,很好的规避了普通工厂的这两个缺点,新增花的品种,只要添加新的花品种的工厂类即可,但是这种方式会造成有非常多的类需要维护,不方便于代码的管理和维护。需要定义一个抽象工厂,和每一种花的实例工厂用于创建自身的实例(相当于知道了花店的地址,这个花店只卖这一种花的情况)。(3)、创建工厂的示例,使用工厂的创建方法创建需要的对象。原创 2024-04-25 20:37:39 · 384 阅读 · 0 评论 -
Java设计模式_概述(设计模式类型和基本原则)
通过合成,可以将已有的类组合成新的类,达到复用的目的,同时保持类的简单和清晰。设计模式(Design pattern)代表了最佳的实践,是软件开发人员在软件开发过程中面临一般问题的解决方案,是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。但不推荐刚入门的开发者学习,哪怕把代码搞的一塌糊涂,也要先将功能完成,初学者,迈过坑是必然的,只有对自己编写的代码不满意,你才会体会到设计模式的重要性,也才能更加理解。也就是说,一个类应该尽量减少与其他类的耦合度,只与它直接相关的类进行交互。原创 2024-04-25 17:04:56 · 957 阅读 · 0 评论 -
java算法 递归运算优化(备忘录模式)
从运行结果看,常规递归和备忘录算法递归都可以得到正确的结果,不过相对而言,备忘录算法的耗时和运行次数都要更优于常规递归操作。原因很简单,备忘录模式就是借助临时空间,把已经运算过的结果存储到临时空间中,下一次发现为相同运算时,就不需要再次进行逻辑运算,只需要从临时空间中取出值即可。也是一种典型的以空间换时间的想法。其一,相邻的数据存在一定的逻辑关系,其二、必须存在出口的值,如第一个元素或者最后元素的值能轻松计算出来。1、题目:斐波那契数列: 指的是这样一个数列:1、1、2、3、5、8、13、21、34、……原创 2024-04-24 15:18:29 · 751 阅读 · 0 评论 -
Java算法 空间换时间(找重复)
如下图可以看到,因为出现了两次2,就会在新数组的第3个位置进行两次自增,而不重复的值,只会在自己值对应的下标处自增1次。所以可以新数组值为2的地方,下标就是数组1中的重复值。生成空间数组0 0 0 0 0 实际上就是记录重复值出现的次数(第1个记录0的出现次数,第2个记录1的出现次数,第3个记录2的出现次数…1、题目:题目:0-999的数组中,添加一个重复的元素,打乱后,找出这个重复元素。空间换时间算法,是算法中最常见的一种,以牺牲一定空间为代价,换得时间的耗时更少。原创 2024-04-24 15:04:58 · 410 阅读 · 0 评论 -
Java算法 异或^运算(找重复,交换值)
当对两个布尔表达式运算时,两个结果不同(一个true,一个false),返回true;两个结果相同(同为true,同为false),返回false。异或运算满足交换律和结合律,即a ^ b ^ a = b ^ a ^ a = b ^ (a ^ a) = b ^ 0 = b。// 输出: 6,二进制表示: 0110。当对两个二进制位进行比较:如果两个位相同,则结果为0;任何数和0做异或运算,结果仍然是原来的数,即a ^ 0 = a。任何数和其自身做异或运算,结果是0,即a ^ a = 0。原创 2024-04-24 09:23:39 · 2777 阅读 · 0 评论 -
Java Spring创建bean流程及自定义构造方法示例
是Spring框架中非常强大的一个接口,它允许开发者在Spring容器创建和初始化Bean的过程中插入自定义的逻辑。(3)、系统定义了实现BeanPostProcessor接口的类,会在创建每一个bean之前执行(postProcessBeforeInitialization)和之后执行(postProcessAfterInitialization)方法等等。如果类中存在@Autowired或有参的构造方法,会先从单例池获取对象,如果单例池没有对象则会创建对象,之后在放入单例池中。2、找到类的构造方法。原创 2024-03-25 17:14:17 · 1988 阅读 · 0 评论