参考外国文献:http://h5ip.cn/lPtD

作者:肥朝 | 微信公众号:肥朝(ID:feichao_java)

一、结构性模式:

1、适配器模式:

常用于将一个新接口适配旧接口

肥朝小声逼逼:在我们业务代码中经常有新旧接口适配需求,可以采用该模式。

2、桥接模式:

将抽象和抽象的具体实现进行解耦,这样可以使得抽象和抽象的具体实现可以独立进行变化。

肥朝小声逼逼:这个模式,其实我们每天都在用到,但是你可能却浑然不知。只要你用到面向接口编程,其实都是在用桥接模式。

3、组合模式

让客户端看起来在处理单个对象和对象的组合是平等的,换句话说,某个类型的方法同时也接受自身类型作为参数。(So in other words methods on a type accepting the same type)

肥朝小声逼逼:从上面那句英文我们就可以得知,组合模式常用于递归操作的优化上,比如每个公司都有个boss系统,都会有什么菜单的功能。比如一级菜单下有二级菜单,二级菜单又有三级菜单。删除一级菜单的时候需要不断删除子菜单,那么这个设计模式你可以试试。总之,凡是有级联操作的,你都可以尝试这个设计模式。

4、装饰者模式

动态的给一个对象附加额外的功能,因此它也是子类化的一种替代方法。该设计模式在JDK中广泛运用,以下只是列举一小部分

肥朝小声逼逼:这个模式使用就太广了,我们常用的AOP,既有动态代理,也有装饰者的味道。

5、门面模式

为一组组件,接口,抽象或子系统提供简化的接口。

肥朝小声逼逼:我们每天使用的SLFJ日志就是门面日志,比如我们使用Dubbo,向外提供的服务就尽量采用门面模式,然后服务在调用各种service做聚合。

6、享元模式

使用缓存来减少对小对象的访问时间

肥朝小声逼逼:只要用到了缓存,基本都是在使用享元模式。很多同学都说自己的项目太low了,都没有用到什么设计模式,这不是开玩笑吗,你用个map缓存几个对象,基本上都运用了享元的思想。

7、代理模式

代理模式用于向较简单的对象代替创建复杂或耗时的对象。

肥朝小声逼逼:代理模式用得很广泛,基本所有大家知道的开源框架,都用到了动态代理。

二、创建模式

1、抽象工厂模式

抽象工厂模式提供了一个协议来生成一系列的相关或者独立的对象,而不用指定具体对象的类型。它使得应用程序能够和使用的框架的具体实现进行解耦。在JDK和许多开源框架,比如Spring中随处可见,它们很容易被发现。任何用于创建对象但返回接口或抽象类的,就是抽象工厂模式了。(any method that is used to create an object but still returns a interface or abstract class)

肥朝小声逼逼:从英文就可以得出,该模式可以与策略模式结合使用。

2、建造者模式

用于通过定义一个类来简化复杂对象的创建,该类的目的是构建另一个类的实例。构建器模式还允许实现Fluent接口。

肥朝小声逼逼:这个在我们业务代码中使用的场景太广泛了。比如订单系统大部分项目都有,订单对象就是一个复杂对象,我们就可以采用建造者模式来做。

3、工厂方法

只是一个返回实际类型的方法。

肥朝小声逼逼:这个属于大家都会的设计模式,不多过介绍。

4、原型模式

使得类的实例能够生成自身的拷贝。如果创建一个对象的实例非常复杂且耗时时,就可以使用这种模式,而不重新创建一个新的实例,你可以拷贝一个对象并直接修改它。

肥朝小声逼逼:这个你以为是冷门的设计模式,其实错了,这个是大热门的设计模式。比如我们业务代码,经常要各种DTO、BO、DO、VO转换,其实就可以参考原型设计模式的思想来做。

5、单例模式

用来确保类只有一个实例。Joshua Bloch在Effetive Java中建议到,还有一种方法就是使用枚举。

肥朝小声逼逼:在平时开发中,单例是我们用得最多的了,因为Spring的bean,默认就是单例级别的。单例属于大家基本都会的设计模式。

三、行为模式

1、责任链

通过把请求从一个对象传递到链条中下一个对象的方式来解除对象之间的耦合,直到请求被处理完毕。链中的对象是同一接口或抽象类的不同实现。

肥朝小声逼逼:凡是带有Filter关键词的,基本都在用这个设计模式。在业务代码使用的场景实在是太多了,用到拦截器的地方基本都在用这个设计模式。

2、命令模式

将命令包装在对象中,以便可以将其存储,传递到方法中,并像任何其他对象一样返回。

肥朝小声逼逼:命令模式使用频率较高,和策略模式比较像,具体区别可以搜索一下。如果用过Activiti工作流引擎的朋友可以看一下里面的源码,很多地方都用到了命令模式。

3、解释器模式

此模式通常描述为该语言定义语法并使用该语法来解释该格式的语句。(This pattern generally describes defining a grammar for that language and using that grammar to interpret statements in that format.)

肥朝小声逼逼:这个比较冷门,肥朝没怎么用过,你用过的话可以留言告诉肥朝。

4、迭代器模式

提供一个统一的方式来访问集合中的对象。

肥朝小声逼逼:这个中间件和基础框架组的同学可能用得比较多,业务代码的话用得不多,不过JDK中的这种使用很经典,可以看看。

5、中介者模式

通过使用一个中间对象来进行消息分发以及减少类之间的直接依赖。

肥朝小声逼逼:看到这个描述不用我多说什么,业务代码使用的场景太多了。比如你们用MQ,其实就是在用中介者模式。所以肥朝一再强调,即使是每天CRUD,关注肥朝一起学习,也能给你的CRUD项目,加上美颜+滤镜(设计模式)的加强效果。

6、备忘录模式

生成对象状态的一个快照,以便对象可以恢复原始状态而不用暴露自身的内容。比如Date对象通过自身内部的一个long值来实现备忘录模式。

肥朝小声逼逼:这个在业务中使用得不多,据肥朝了解其中一种场景是,你要把数据丢到MQ,但是MQ暂时不可用,那么你把数据暂存到DB,后面再轮询丢到MQ。如果你有更好的场景,留言告诉肥朝。

7、空对象模式

它允许您抽象空对象的处理。

肥朝小声逼逼:这个业务代码用得不多,但是JDK中的这几个方法我们倒是挺常用的。

8、观察者模式

用于为组件提供一种灵活地向感兴趣的接收者广播消息的方式。

肥朝小声逼逼:我们业务代码一般是基于Zookeeper来做观察者的。基本上用到ZK的地方,都是在用观察者模式,比如分布式锁,比如服务发现等。

9、状态模式

允许您在运行时根据内部状态轻松更改对象的行为。

肥朝小声逼逼:这个在业务代码用得就太广泛了,我就不信你们系统还没有“状态”了。比如我们常见的订单状态或者各种XX状态,都可以用得上。

10、策略模式

使用这个模式来将一组算法封装成一系列对象。通过调用这些对象可以灵活的改变程序的功能。

肥朝小声逼逼:这个太高频了,常用于优化大量的if-else,如果这个设计模式都不会,出去不要说关注过肥朝的公众号!

11、模板方法模式

让子类可以重写方法的一部分,而不是整个重写,你可以控制子类需要重写那些操作。

肥朝小声逼逼:这个模式也是非常高频的模式。业务代码中经常遇到有很多相同的部分,我们可以做一个抽象类,子类来实现差异化,如果还不知道的,赶紧搜索一下,再次强调,非常高频。

12、访问者模式

提供一个方便的可维护的方式来操作一组对象。它使得你在不改变操作的对象前提下,可以修改或者扩展对象的行为。

肥朝小声逼逼:这个肥朝使用的频率不高,如果你有在业务代码中使用,欢迎留言告诉肥朝。

四、写在最后

你项目都用到了哪些设计模式?亦或者上述设计模式你在实际业务代码中有更好的场景,欢迎留言。

热门内容:

1、一个计算机底层的面试题,瞬间就被干懵了!

2、中国首个个人主导的Apache孵化项目SkyWalking成功毕业!

3、一线大厂的分布式唯一ID生成方案是什么样的?

4、Dubbo 3.0 !提升不止一点点!

5、Spring Boot中如何干掉过多的if else!

6、阿里P8无相告诉你:我们能从IDEA中学到什么?

7、Kafka竟然不支持读写分离!今天才知道!

8、Java 8中Stream API的这些奇技淫巧!你都Get到了吗?

JDK源码中,都有哪些NB的设计模式?相关推荐

  1. 17.你知道哪些设计模式,它们在JDK源码中是怎么体现的

    17.你知道哪些设计模式,它们在JDK源码中是怎么体现的 参考外国文献:http://h5ip.cn/lPtD 作者:肥朝 | 微信公众号:肥朝(ID:feichao_java) 一.结构性模式: 1 ...

  2. 策略模式在JDK 源码中的体现

    首先来看一个比较常用的比较器Comparator 接口,我们看到的一个大家常用的compare()方法,就是一个策略抽象实现: Comparator 抽象下面有非常多的实现类,我们经常会把Compar ...

  3. Redis源码和java jdk源码中hashcode的不同实现

    一.redis实际上是使用了siphash 这个比较简单,我说的简单是指redis代码比较少不像jdk一样调用C++代码调用栈非常深. 先看这个rehashing.c 主要就是dictKeyHash函 ...

  4. JDK源码中,都有哪些设计模式

    文章转自微信公众号:肥朝(ID:feichao_java) 一.结构性模式: 1.适配器模式: 常用于将一个新接口适配旧接口 肥朝小声逼逼:在我们业务代码中经常有新旧接口适配需求,可以采用该模式. 2 ...

  5. 如何优雅的创建一个Java不可变对象类,JDK源码中也是这么干的!

    前面有篇文章当介绍了Java的不可变对象的一些特性,以及它的一些好处,但是并没有介绍如何实现一个不可变对象类.今天就来看看如何实现一个不可变对象类. Java中常用的不可变对象类 String类应该是 ...

  6. 年轻人,告诉我 :Mybatis 源码中,用了多少种设计模式?

    一.前言:小镇卷码家 总有不少研发伙伴问小傅哥:"为什么学设计模式.看框架源码.补技术知识,就一个普通的业务项目,会造飞机不也是天天写CRUD吗?" 你说的没错,但你天天写CRUD ...

  7. 享元模式在JDK源码中的应用——Java设计模式系列学习笔记

    1. String中的享元模式 Java中将String类定义为final(不可改变的),JVM中字符串一般保存在字符串常量池中,java会确保一个字符串在常量池中只有一个拷贝,这个字符串常量池在JD ...

  8. 【设计模式系列20】解释器模式原理及其在JDK和Spring源码中的体现

    解释器模式原理及其在JDK源码中的体现 设计模式系列总览 前言 什么是解释器模式 终结符表达式和非终结符表达式 解释器模式示例 解释器模式角色 解释器模式在JDK和Spring源码中应用 解释器模式应 ...

  9. 结合JDK源码看设计模式——简单工厂、工厂方法、抽象工厂

    三种工厂模式的详解: 简单工厂模式: 适用场景:工厂类负责创建的对象较少,客户端只关心传入工厂类的参数,对于如何创建对象的逻辑不关心 缺点:如果要新加产品,就需要修改工厂类的判断逻辑,违背软件设计中的 ...

最新文章

  1. vim 插件_vim插件YouCompleteMe配置
  2. 《每日一题》62. Unique Paths 不同路径
  3. 密钥交换算法 - Java加密与安全
  4. chrome切换前端模式_Chrome调试工具developer tool技巧 - 轩枫阁
  5. es创建索引设置字段不分词_java整合es指定字段不分词搜索
  6. mysql定义和调用存储过程
  7. [渝粤教育] 西南科技大学 农业技术经济学 在线考试复习资料
  8. javascript中for循环里面套定时器,始终打印结束值原因
  9. 【踩坑速记】二次依赖?android studio编译运行各种踩坑解决方案,杜绝弯路,总有你想要的~...
  10. android8.1dolby,努比亚X刷杜比音效教程-按推理支持绝多数安卓8和安卓9系统
  11. Intel HD Graphics
  12. java html转word的坑 poi样式丢失还乱码
  13. office 2010 word文档,插入复选框,方框打勾(打对号)的方法
  14. 专转本c语言刷题app,南京晓庄学院五年一贯制专转本c语言模拟考试2
  15. Wechall Challenges Writeup 知识拓展
  16. 【支线】基于Aidlux的Arduino小车
  17. 非线性规划求解_突破 | 杉数求解器COPT首发求解内点法
  18. python和汇编_python – 你对这些汇编助记符有什么建议吗?
  19. matlab heart scale,libsvm-3.18 heart_scale文件格式错误
  20. vue固定资产管理系统_Java 开源办公开发平台 O2OA V5.1.1 发布 | 支持 Vue、React、Angular...

热门文章

  1. 【从0到1搭建LoRa物联网】16、LoRa连接到腾讯云物联网平台
  2. 拼多多企业入驻条件是什么?和个人入驻有啥区别?
  3. LQBv16-Python:用莱布尼兹公式计算圆周率π
  4. 什么是auto?auto的作用?
  5. npm没有权限,显示no such file or directory
  6. 用 LINQ 编写 C# 都有哪些一招必杀的技巧?
  7. 【linuxs make 出现undefined reference to ‘std::__cxx11...】
  8. python 入门零碎知识点
  9. STM32的超声波测距程序
  10. 给游戏开发初学者的10条建议