从JDK中,我们能学到哪些设计模式?

作者:肥朝  来自:肥朝(ID:feichao_java)

结构性模式:

适配器模式:

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

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

桥接模式:

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

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

组合模式

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

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

装饰者模式

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

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

门面模式

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

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

享元模式

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

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

代理模式

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

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

创建模式

抽象工厂模式

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

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

建造者模式

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

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

工厂方法

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

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

原型模式

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

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

单例模式

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

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

行为模式

责任链

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

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

命令模式

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

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

解释器模式

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

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

迭代器模式

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

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

中介者模式

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

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

备忘录模式

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

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

空对象模式

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

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

观察者模式

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

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

状态模式

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

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

策略模式

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

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

模板方法模式

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

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

访问者模式

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

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

写在最后

你项目都用到了哪些设计模式?亦或者上述设计模式你在实际业务代码中有更好的场景,欢迎扫描下方二维码后,留言告诉肥朝。

【End】

老王给大家准备一份「Java最常见200+面试题全解析」,助力大家找到更好的工作,这份面试题包含的模块:

  • Java、JVM 最常见面试题解析

  • Spring、Spring MVC、MyBatis、Hibernate 面试题解析

  • MySQL、Redis 面试题解析

  • RabbitMQ、Kafka、Zookeeper 面试解析

  • 微服务 Spring Boot、Spring Cloud 面试解析

扫描下面二维码付费阅读

关注下方二维码,订阅更多精彩内容。

转发朋友圈,是对我最大的支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/546650.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二、华为鸿蒙开发DevEco Studio运行第一个Hello World工程

1.打开DevEco Studio,创建一个Empty Ability(Java)工程,工程类型:Application 2.按照下图,Tools->Device Manager打开设备管理

解析url

2019独角兽企业重金招聘Python工程师标准>>> #include <stdio.h> #include <string.h> #include <stdlib.h>// 解析url&#xff0c;作为示例&#xff0c;很多情况没考虑&#xff0c;比如说user,pass之类的 int parse_url(char *url, char **serve…

面试官:讲一下Jvm中如何判断对象的生死?

但凡问到 JVM&#xff08;Java 虚拟机&#xff09;通常有 99% 的概率一定会问&#xff0c;在 JVM 中如何判断一个对象的生死状态&#xff1f;判断对象的生死状态的算法有以下几个&#xff1a;1、引用计数器算法引用计算器判断对象是否存活的算法是这样的&#xff1a;给每一个对…

三、华为鸿蒙HarmonyOS应用开发HUAWEI DevEco Studio实现页面跳转

在上一节二、华为鸿蒙开发DevEco Studio运行第一个Hello Word工程 基础上进行下面步骤。 在Java UI框架中,提供了两种编写布局的方式:在XML中声明UI布局和在代码中创建布局。这两种方式创建出的布局没有本质差别,为了熟悉两种方式,我们将通过XML的方式编写第一个页面,通过…

MVVM架构~前台后台分离的思想与实践

返回目录 MVVM是一种架构思想&#xff0c;是一种解决问题的方式&#xff0c;对于一个项目&#xff0c;一个功能模块&#xff0c;你可以选择使用&#xff2d;&#xff36;&#xff36;&#xff2d;的架构来实现&#xff0c;而knockoutjs只是实现MVVM的一种工具&#xff0c;它是在…

Java中所有锁介绍

在读很多并发文章中&#xff0c;会提及各种各样锁如公平锁&#xff0c;乐观锁等等&#xff0c;这篇文章介绍各种锁的分类。介绍的内容如下&#xff1a;1.公平锁 / 非公平锁2.可重入锁 / 不可重入锁3.独享锁 / 共享锁4.互斥锁 / 读写锁5.乐观锁 / 悲观锁6.分段锁7.偏向锁 / 轻量…

python深拷贝,浅拷贝,赋值引用

1.在python中&#xff0c;对象赋值实际上是对象的引用。当创建一个对象&#xff0c;然后把它赋给另一个变量的时候&#xff0c;python并没有拷贝这个对象&#xff0c;而只是拷贝了这个对象的引用 &#xff08;1&#xff09;直接赋值,默认浅拷贝传递对象的引用而已,原始列表改变…

pjtool用到的数据库----oracle范畴

PL/SQL Developer 专门面向Oracle数据库存储程序单元的开发 PL/SQL&#xff1a;过程化SQL语言转载于:https://www.cnblogs.com/ejllen/p/3684890.html

如何让mysql索引更快一点

后端开发&#xff0c;公众号内容包括但不限于 python、mysql、数据结构和算法、网络协议、Linux。技术人怎能只有技术和代码&#xff0c;如果你对投资理财、保险&#xff0c;英语学习、读书写作有兴趣&#xff0c;都欢迎来公众号【谭某人】与我交流&#xff0c;你总会有些收获。…

将本地项目上传到码云(gitee)远程仓库

前提条件&#xff1a; 1、本地电脑上已经安装了 git客户端&#xff0c;未安装的&#xff0c;具体安装过程可以参考此安装链接&#xff1a;https://blog.csdn.net/ezreal_tao/article/details/81609883 2、用户已经在gitee码云上注册完成 具体操作步骤&#xff1a; 1、登录码云…

单线程的Redis为什么却能支撑高并发?

作者&#xff1a;Draveness原文链接&#xff1a;draveness.me/redis-io-multiplexing最近在看 UNIX 网络编程并研究了一下 Redis 的实现&#xff0c;感觉 Redis 的源代码十分适合阅读和分析&#xff0c;其中 I/O 多路复用&#xff08;mutiplexing&#xff09;部分的实现非常干净…

在Windows10上安装WSL使用binwalk命令

Windows 10 推出的WSL 功能可以协助我们直接使用binwalk 分析Windows 内的文件 一、WSL 准备 1、打开控制面板→应用→程序和功能→启动或关闭Windows 功能&#xff0c;打开“适用于Linux 的Windows 子系统”和“虚拟机平台”&#xff0c;随后需要重启。 2、打开Windows 10 自…

最详细的 IDEA调试教程

Debug用来追踪代码的运行流程&#xff0c;通常在程序运行过程中出现异常&#xff0c;启用Debug模式可以分析定位异常发生的位置&#xff0c;以及在运行过程中参数的变化。通常我们也可以启用Debug模式来跟踪代码的运行流程去学习三方框架的源码。在Intellij IDEA中使用好Debug&…

centos 修改ip地址

为什么80%的码农都做不了架构师&#xff1f;>>> 查看IP地址 1 登陆连接centos系统&#xff0c;输入 ifconfig 可以查看到当前本机的IP地址信息&#xff0c;如下图 临时设置IP地址 1 如本机为例&#xff0c;上面查询IP为1.117&#xff0c;输入 ifconfig eth0 &…

经典面试题:如何保证缓存与数据库的双写一致性?

作者&#xff1a;你是我的海啸地址&#xff1a;http://t.cn/EK64FeP只要用缓存&#xff0c;就可能会涉及到缓存与数据库双存储双写&#xff0c;你只要是双写&#xff0c;就一定会有数据一致性的问题&#xff0c;那么你如何解决一致性问题&#xff1f;面试题剖析一般来说&#x…

四、华为鸿蒙HarmonyOS应用开发之Java开发下Page Ability生命周期

系统管理或用户操作等行为均会引起Page实例在其生命周期的不同状态之间进行转换。Ability类提供的回调机制能够让Page及时感知外界变化,从而正确地应对状态变化(比如释放资源),这有助于提升应用的性能和稳健性。 Page生命周期回调 Page生命周期的不同状态转换及其对应的回…

写简历的十大误区

作者&#xff1a;Coody地址&#xff1a;my.oschina.net/hooker/blog/3014656在互联网极速膨胀的社会背景下&#xff0c;各行各业涌入互联网的IT民工日益增大。早在2016年&#xff0c;我司发布了Java、Ios工程师的招聘信息&#xff0c;就Java工程师单个岗位而言&#xff0c;日收…

面试官问你MySQL的优化,看这篇文章就够了

作者&#xff1a;zhangqhsegmentfault.com/a/1190000012155267一、EXPLAIN做MySQL优化&#xff0c;我们要善用 EXPLAIN 查看SQL执行计划。下面来个简单的示例&#xff0c;标注(1,2,3,4,5)我们要重点关注的数据type列&#xff0c;连接类型。一个好的sql语句至少要达到range级别。…

六、华为鸿蒙HarmonyOS应用开发之Java开发模式下的不同Page 间实现页面跳转

不同Page 间导航&#xff0c;实现页面跳转 AbilitySlice作为Page的内部单元&#xff0c;以Action的形式对外暴露&#xff0c;因此可以通过配置Intent的Action导航到目标AbilitySlice。Page间的导航可以使用startAbility()或startAbilityForResult()方法&#xff0c;获得返回结…

MySQL 快速创建千万级测试数据

作者&#xff1a;IKNOW本尊链接&#xff1a;http://t.cn/E96Shud背景在进行查询操作的性能测试或者 sql 优化时&#xff0c;我们经常需要在线下环境构建大量的基础数据供我们测试&#xff0c;模拟线上的真实环境。总不能让我去线上去测试吧&#xff0c;会被DBA砍死的创建测试数…