JDK中用到了哪些设计模式

一,结构型模式

1,适配器模式

用来把一个接口转化成另一个接口

java.util.Arrays#asList()

javax.swing.JTable(TableModel)

java.io.InputStreamReader(InputStream)

java.io.OutputStreamWriter(OutputStream)

javax.xml.bind.annotation.adapters.XmlAdapter#marshal()

javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal()

2,桥接模式

这个模式将抽象和抽象操作的实现进行了解耦,这样使得抽象和实现可以独立地变化

AWT (It provides an abstraction layer which maps onto the native OS the windowing support.)

JDBC

3,组合模式

使得客户端看来单个对象和对象的组合是同等的。换句话说,某个类型的方法同时也接受自身类型作为参数

javax.swing.JComponent#add(Component)

java.awt.Container#add(Component)

java.util.Map#putAll(Map)

java.util.List#addAll(Collection)

java.util.Set#addAll(Collection)

4,装饰者模式

动态的给一个对象附加额外的功能,这也是子类的一种替代方式。可以看到,在创建一个类型的时候,同时也传入同一类型的对象。这在JDK里随处可见,你会发现它无处不在,所以下面这个列表只是一小部分

java.io.BufferedInputStream(InputStream)

java.io.DataInputStream(InputStream)

java.io.BufferedOutputStream(OutputStream)

java.util.zip.ZipOutputStream(OutputStream)

java.util.Collections#checked<list |sortedmap |sortedset |set |map>

5,门面模式

给一组组件,接口,抽象,或者子系统提供一个简单的接口

java.lang.Class

javax.faces.webapp.FacesServlet

6,享元模式

使用缓存来加速大量小对象的访问时间

java.lang.Integer#valueOf(int)

java.lang.Boolean#valueOf(boolean)

java.lang.Byte#valueOf(byte)

java.lang.Character#valueOf(char)

7,代理模式

代理模式是用一个简单的对象来代替一个复杂的或者创建耗时的对象。

java.lang.reflect.Proxy

RMI


二,创建模式

1,抽象工厂模式

抽象工厂模式提供了一个协议来生成一系列的相关或者独立的对象,而不用指定具体对象的类型。它使得应用程序能够和使用的框架的具体实现进行解耦。这在JDK或者许多框架比如Spring中都随处可见。它们也很容易识别,一个创建新对象的方法,返回的却是接口或者抽象类的,就是抽象工厂模式了

java.util.Calendar#getInstance()

java.util.Arrays#asList()

java.util.ResourceBundle#getBundle()

java.sql.DriverManager#getConnection()

java.sql.Connection#createStatement()

java.sql.Statement#executeQuery()

java.text.NumberFormat#getInstance()

javax.xml.transform.TransformerFactory#newInstance()

2,建造模式(Builder)

定义了一个新的类来构建另一个类的实例,以简化复杂对象的创建。建造模式通常也使用方法链接来实现

java.lang.StringBuilder#append()

java.lang.StringBuffer#append()

java.sql.PreparedStatement

javax.swing.GroupLayout.Group#addComponent()

3,工厂方法

就是一个返回具体对象的方法

java.lang.Proxy#newProxyInstance()

java.lang.Object#toString()

java.lang.Class#newInstance()

java.lang.reflect.Array#newInstance()

java.lang.reflect.Constructor#newInstance()

java.lang.Boolean#valueOf(String)

java.lang.Class#forName()

4,原型模式

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

java.lang.Object#clone()

java.lang.Cloneable

5,单例模式

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

java.lang.Runtime#getRuntime()

java.awt.Toolkit#getDefaultToolkit()

java.awt.GraphicsEnvironment#getLocalGraphicsEnvironment()

java.awt.Desktop#getDesktop()


三,行为模式

1,责任链模式

通过把请求从一个对象传递到链条中下一个对象的方式,直到请求被处理完毕,以实现对象间的解耦

java.util.logging.Logger#log()

javax.servlet.Filter#doFilter()

2,命令模式

将操作封装到对象内,以便存储,传递和返回

java.lang.Runnable

javax.swing.Action

3,解释器模式

这个模式通常定义了一个语言的语法,然后解析相应语法的语句

java.util.Pattern

java.text.Normalizer

java.text.Format

4,迭代器模式

提供一个一致的方法来顺序访问集合中的对象,这个方法与底层的集合的具体实现无关

java.util.Iterator

java.util.Enumeration

5,中介者模式

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

java.util.Timer

java.util.concurrent.Executor#execute()

java.util.concurrent.ExecutorService#submit()

java.lang.reflect.Method#invoke()

6,备忘录模式

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

java.util.Date

java.io.Serializable

7,空对象模式

这个模式通过一个无意义的对象来代替没有对象这个状态。它使得你不用额外对空对象进行处理

java.util.Collections#emptyList()

java.util.Collections#emptyMap()

java.util.Collections#emptySet()

8,观察者模式

它使得一个对象可以灵活的将消息发送给感兴趣的对象

java.util.EventListener

javax.servlet.http.HttpSessionBindingListener

javax.servlet.http.HttpSessionAttributeListener

javax.faces.event.PhaseListener

9,状态模式

通过改变对象内部的状态,使得你可以在运行时动态改变一个对象的行为

java.util.Iterator

javax.faces.lifecycle.LifeCycle#execute()

10,策略模式

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

java.util.Comparator#compare()

javax.servlet.http.HttpServlet

javax.servlet.Filter#doFilter()

11,模板方法模式

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

java.util.Collections#sort()

java.io.InputStream#skip()

java.io.InputStream#read()

java.util.AbstractList#indexOf()

12,访问者模式

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

javax.lang.model.element.Element and javax.lang.model.element.ElementVisitor

javax.lang.model.type.TypeMirror and javax.lang.model.type.TypeVisitor

译者注:很多地方可能会存在争议,是否是某种模式其实并不是特别重要,重要的是它们的设计能为改善我们的代码提供一些经验

本文由 mdnice 多平台发布

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

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

相关文章

48.基于SpringBoot + Vue实现的前后端分离-雪具销售系统(项目 + 论文PPT)

项目介绍 本站是一个B/S模式系统&#xff0c;采用SpringBoot Vue框架&#xff0c;MYSQL数据库设计开发&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得基于SpringBoot Vue技术的雪具销售系统设计与实现管理工作系统…

无人机发展历史

你知道吗&#xff1f;无人机竟然已经有这么多年的历史了&#xff01;从最初的军事用途&#xff0c;到现在的民用、商用领域&#xff0c;无人机的发展简直是一部传奇&#xff01; &#x1f680; 遥想当年&#xff0c;无人机还只是军事领域的专属玩具&#xff0c;高不可攀。但如…

Linux的学习之路:12、地址空间(续)与进程的创建、终止和等待

摘要 本章将讲述上章没说的一些东西以及进程创建终止与等待 目录 摘要 一、地址空间&#xff08;续&#xff09; 二、创建 三、终止 四、等待 五、思维导图 一、地址空间&#xff08;续&#xff09; 上篇文章中介绍了地址空间&#xff0c;但是没有说为什么会有地址空间…

通过WSL在阿里云上部署Django项目MySQL

前端用Vue&#xff0c;后端用Django&#xff0c; nginx&#xff0c;Mysql 参照&#xff1a; 通过WSL在阿里云上部署Vue项目_阿里云 wsl-CSDN博客 阿里云重登录 采用Ubuntu系统&#xff0c; apt update #检查是否已经安装 mysql --version systemctl status mysql apt insta…

hook某银行加固app

分析 要在未修复dex并打包情况下对其app内在类进行hook&#xff0c;单纯的hook会由于加固的问题而导致加载不到内在想hook的类。因此需要进行加载加固的classloader。 在此之前需要先了解Context 在Android中&#xff0c;只有Application、Activity以及Service有自己的Contex…

Gradle系列(3)——Gradle extension(gradle扩展),如何自定义gradle扩展,AppPlugin,AppExtension原理

文章目录 1.什么是Extensions2.如何自定义Extension3.问题来了——如何通过自定义Extension给Plugin传递数据4.BaseAppModuleExtension和AppPlugin部分原理BuildTypes是如何创建并传递数据给AppPlugin的&#xff1f;AppPlugin是如何接收数据的&#xff1f;buildTypeContainer流…

HDLbits 刷题 -- Mux256to1

Create a 1-bit wide, 256-to-1 multiplexer. The 256 inputs are all packed into a single 256-bit input vector. sel0 should select in[0], sel1 selects bits in[1], sel2 selects bits in[2], etc. Expected solution length: Around 1 line. 译&#xff1a; 创建一个…

CESS 受邀出席香港Web3.0标准化协会第一次理事会议,共商行业未来

2024 年 4 月 5 日&#xff0c;CESS&#xff08;Cumulus Encrypted Storage System&#xff09;作为香港 Web3.0 标准化协会的副理事会成员&#xff0c;于香港出席了 2024 年度第一次理事会会议。此次会议汇聚了来自不同领域的知名企业和专家&#xff08;参会代表名单见文末&am…

Linux——守护进程

在这篇文章中我介绍了关于tcp网络套接字&#xff0c;关于网络套接字编程的问题我会再次讲述一点东西&#xff0c;然后介绍关于守护进程的知识。 1. 关于网络套接字编程的一些问题 在进行套接字编程时我们一定是得先有套接字&#xff0c;并且我们在使用socket的一些接口时&…

2024年最佳游戏下载网站:6miu盘搜

2024有哪些好的游戏下载网站&#xff1f; 6miu盘搜是一款功能强大的网盘搜索工具,可以快速搜索并下载各种游戏。它支持多种搜索方式,包括游戏名称、游戏类型、发行商等,并且可以根据游戏大小进行精准搜索。用户可以通过6miu盘搜的高级搜索功能,找到自己需要的游戏,无论是在公共…

mysql开启基于位点的主从复制

MySQL的主从复制涉及至少两个MySQL实例&#xff1a;一个主库&#xff08;Master&#xff09;和一个或多个从库&#xff08;Slave&#xff09;。主库负责处理事务并记录所有变更到二进制日志&#xff08;binary log&#xff09;中&#xff0c;而从库通过读取并应用这些变更来保持…

MyBatis 源码分析 - 映射文件解析过程

1.简介 在上一篇文章中&#xff0c;我详细分析了 MyBatis 配置文件的解析过程。由于上一篇文章的篇幅比较大&#xff0c;加之映射文件解析过程也比较复杂的原因。所以我将映射文件解析过程的分析内容从上一篇文章中抽取出来&#xff0c;独立成文&#xff0c;于是就有了本篇文章…

新标准日本语 课后练习

自学错误可能较多&#xff0c;听力题不需要听力的就没听录音 第二十課 スミスさんはピアノを弾くことができます 練習&#xff11;&#xff0d;&#xff11; &#xff11;張さんは日本の歌を歌うことができます 张先生会唱日本歌 &#xff12;小野さんは自転車に乗ることがで…

面试经典150题——跳跃游戏

面试经典150题 day9 题目来源我的题解方法一 动态规划双重循环方法二 贪心 题目来源 力扣每日一题&#xff1b;题序&#xff1a;55 我的题解 方法一 动态规划双重循环 使用一个dp表记录i位置是否可达&#xff0c;然后在判断是否可达时需要看前面的nums[j]j>i&&dp…

对称加密解密

Cipher本身可以加解密byte[]&#xff0c;而且可以设定key和algorithm&#xff0c;安全性高。但是不能直接用于文本。因为UTF-8是可变长度的编码&#xff0c;有的字符需要用多个字节来表示&#xff0c;转换之后会出现byte[]数组长度、内容不一致的情况。 Base64也是对称加解密的…

设计模式代码实战-模版方法模式

1、问题描述 小明喜欢品尝不同类型的咖啡&#xff0c;她发现每种咖啡的制作过程有一些相同的步骤&#xff0c;他决定设计一个简单的咖啡制作系统&#xff0c;使用模板方法模式定义咖啡的制作过程。系统支持两种咖啡类型&#xff1a;美式咖啡&#xff08;American Coffee&#…

RAID 5实训

Raid 5 配置实训 实验结构&#xff1a; 实验步骤 环境准备&#xff0c;Linux操作虚拟机下添加3个及以上的磁盘用于raid 10阵列构建所用&#xff08;本次实验4个&#xff0c;一个用于备用&#xff09;创建raid 5 磁盘阵列格式化并挂载磁盘阵列存储速度检查是否提升安全性能检查…

DevExpress WinForms中文教程 - 如何通过UI测试自动化增强应用可靠性?(二)

DevExpress WinForm拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForm能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜任…

C++进阶——继承

前言&#xff1a;从这篇文章开始&#xff0c;我们进入C进阶知识的分享&#xff0c;在此之前&#xff0c;我们需要先来回顾一个知识&#xff1a; C语言有三大特性&#xff0c;分别是封装、继承和多态&#xff0c;而我们前边所分享的各种容器类&#xff0c;迭代器等&#xff0c;…

数据结构----链表算法题目

1.移除链表的元素 这个题目我们有多种解决方案 &#xff08;1&#xff09;思路A&#xff1a;遍历整串数据&#xff0c;如果是我们想要删除的数据&#xff0c;就让这个数字后面的数字全部向前移动直到整传数字全部遍历完成&#xff1b;这个方法的时间复杂度是N的平方&#xff…