设计模式
文章平均质量分 67
通过设计模式让代码更优雅
爱琴孩
扫盲+科普+解惑,愿天下程序员每天少掉头发
展开
-
模版模式和策略模式的区别
模板模式(Template Pattern)和策略模式(Strategy Pattern)是两种常用的设计模式,它们在解决不同的问题上有一些区别。模板模式是一种行为设计模式,它定义了一个算法的骨架,将一些步骤的具体实现延迟到子类中。模板模式通过在父类中定义算法的骨架然后使用抽象方法暴露可变部分,使得子类可以根据自身需求实现具体的步骤。这种方式可以确保算法的结构不变,但允许特定步骤的自定义实现。策略模式也是一种行为设计模式,它定义了一组可以相互替换的算法,并使得这些算法可以独立于使用算法的客户而变化。原创 2023-07-23 10:20:41 · 495 阅读 · 0 评论 -
用枚举类写策略模式,codeReview时被“喷”了
经典模式显然不合适了,如果逻辑比较简单,比如说文中这种简单的排序展示,并且策略比较多的时候,选用枚举策略模式是很合适的,这样可以减少策略类,避免造成类泛滥。如果每个策略的业务逻辑比较复杂,策略类比较少,那么结合spring 的工厂模式是比较合适的。原创 2023-06-23 09:56:34 · 768 阅读 · 0 评论 -
还在用双重校验锁实现单例模式?
在所有的单例实现方式中,枚举是一种在代码写法上最简单的方式,之所以代码十分简洁,是因为Java给我们提供了enum关键字,我们便可以很方便的声明一个枚举类型,而不需要关心其初始化过程中的线程安全问题,因为枚举类在被虚拟机加载的时候会保证线程安全的被初始化。除此之外,在序列化方面,Java中有明确规定,枚举的序列化和反序列化是有特殊定制的。这就可以避免反序列化过程中由于反射而导致的单例被破坏问题。转载 2023-06-22 15:42:13 · 72 阅读 · 0 评论 -
请让责任链模式优雅起来
责任链模式是一种行为设计模式, 允许你将请求沿着处理者链进行发送。收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。责任链的使用场景还是比较多的多条件流程判断:权限控制ERP 系统流程审批:总经理、人事经理、项目经理Java 过滤器 的底层实现 Filter如果不使用该设计模式,那么当需求有所改变时,就会使得代码臃肿或者难以维护,例如下面的例子假设现在有一个闯关游戏,进入下一关的条件是上一关的分数要高于xx游戏一共 3 个关卡进入第二关需要第一关的游戏得分大于等于 80进入第三关需转载 2022-07-10 10:13:38 · 1976 阅读 · 2 评论 -
策略模式在项目中的优雅实践
前言对于策略模式,相比大家都学习过,但是学习归学习,实际在代码中应用还是有必要的,这里来和大家在项目优雅时间策略模式。公司平台是面向C端的,经常做一些运营活动,比如充值卡推荐活动,经常做活动,每次活动运营的卡券都不一样,这边用策略模式对各种卡券做推荐运营。丑陋版的策略模式虽说初始版本较为丑陋,但是也还是策略模式,该有的抽象接口和实现类还是有的。抽象接口订单定义如下public interface RecommendObject { RecommendCard getRecommen原创 2021-11-13 22:08:31 · 753 阅读 · 0 评论 -
简述工厂模式
前言工厂模式在日常开发中是比较常见的一种设计模式,这里来大家一起捋捋简单工厂模式和工厂模式。何谓简单工厂简单工厂不是设计模式,而是一种编程习惯。将创建对象的方法,抽取到一个公共类中,根据类型不同创建相应的对象。不属于23种GOF设计模式之一。下面以获取算奖器的例子来说吧,PL3,DLT等都有自己的算奖器。简单工厂实现方式如下:package factory;public class SimpleCalculatorFactoryDemo { public static abstr转载 2021-05-18 23:24:41 · 185 阅读 · 0 评论 -
构造者模式与Lombok的邂逅
前言大家在构建大对象时,对象的属性比较多,我们可以采用一个构造器或者使用空的构造器构造,然后使用setter方法去设置。在使用者使用这些方法时,会很多冗长的构造器参数列表或者setter方法。我们可以使用Builder模式来简化大对象的构造,提高代码的简洁性,同时提高使用者的编码体验。构造者模式Demo下面这段代码采用构造者模式生成对象实例public class User { private final String name; //必须 private final In原创 2021-01-25 21:52:41 · 156 阅读 · 0 评论 -
策略模式配置化之-SPI源码解析
前言前面在深入策略模式系列中,我们简单介绍了策略模式的原理,以及策略模式在jdk线程池中的应用,这里来和大家学习下策略模式在jdk SPI的应用,这里结合SPI的源码来一起学习下。SPI简介SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。常见的 SPI 有 JDBC、日志门面接口、Spring、SpringBoot相关starter组件、Dubbo、JNDI等。 实际上Java SPI是"基于原创 2020-09-03 23:08:27 · 544 阅读 · 0 评论 -
策略模式在JDK中的应用
前言在多线程编程中,我们经常使用线程池来管理线程,以减缓线程频繁的创建和销毁带来的资源的浪费,在创建线程池的时候,经常使用一个工厂类来创建线程池Executors,实际上Executors的内部使用的是类ThreadPoolExecutor.它有一个最终的构造函数如下public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,转载 2020-08-10 23:07:08 · 366 阅读 · 0 评论 -
深入策略模式(中)
前言策略模式定义了一系列的算法,并将每一个算法封装起来,使每个算法可以相互替代,使算法本身和使用算法的客户端分割开来,相互独立。策略接口角色IStrategy:用来约束一系列具体的策略算法,策略上下文角色ConcreteStrategy使用此策略接口来调用具体的策略所实现的算法。 具体策略实现角色ConcreteStrategy:具体的策略实现,即具体的算法实现。 策略上下文角色StrategyContext:策略上下文,负责和具体的策略实现交互,通常策略上下文对象会持有一个真正的策略实现对象,转载 2020-08-05 22:38:58 · 257 阅读 · 0 评论 -
深入策略模式(上)
前言在讲策略模式之前,我们先看一个日常生活中的小例子:现实生活中我们到商场买东西的时候,卖场往往根据不同的客户制定不同的报价策略,比如针对新客户不打折扣,针对老客户打9折,针对VIP客户打8折...现在我们要做一个报价管理的模块,简要点就是要针对不同的客户,提供不同的折扣报价。如果是有你来做,你会怎么做?丑陋的if-else对于上面的场景,我们可能会这样写package strategy.examp02;import java.math.BigDecimal;public clas转载 2020-08-05 21:50:01 · 148 阅读 · 0 评论 -
模板模式
前言在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。介绍意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。主要解决:一些方法通用,却在每一个子类都重新写了...转载 2018-12-18 13:46:16 · 106 阅读 · 0 评论 -
从网吧上网中学习装饰者模式
前言前面在学习mybatis缓存那些事中,我们提到CachingExecutor,以及cache接口中用到了装饰者设计模式,那么到底什么是装饰者设计模式呢?它有什么优势呢?下面结合网吧上网的例子来看看装饰者模式如何将普通玩家装饰为人民币玩家。装饰者模式介绍1.装饰者类要实现真实类同样的接口2.装饰者类内有一个真实对象的引用(可以通过装饰者类的构造器传入)3.装饰类对象在主类中接...原创 2018-11-18 10:47:48 · 339 阅读 · 0 评论 -
并发单例模式小总结
前言单例模式,设计模式中最常用也是最简单的一种的设计模式。设计模式的作用或者说使用场合想必大家都知道,主要用在实际应用只需要实例化一次的场合,网上的例子也很多,什么打印机的例子等等。我在项目中也是用过单例模式,当时是由于项目需要,需要在应用中动态配置数据库连接池,而这种数据库连接池的配置就只需要在单例模式下进行配置。接下来和大家一起学习总结一下简单的单例模式以及在并发情况下,单例模式是如何保持线程安原创 2017-08-05 10:55:40 · 596 阅读 · 0 评论 -
java中的代理模式
前言代理模式在日常开发中可能用的不多,但是在常见的框架中却经常看到他们的身影,像spring aop就是采用了jdk动态代理和cglib动态代理组合的方式来实现的面向切面编程,有人可能会觉得日常编码中又不会自己去写动态代理,也就不需要关心他就行了。其实我觉得spring框架中运用的这个动态代理,我们就应该好好去学学动态代理,只有自己理解了底层的原理,才能运用好spring aop.所以接下来和大家一原创 2017-07-22 15:17:01 · 363 阅读 · 0 评论