jdk中的设计模式_JDK中的设计模式

jdk中的设计模式

Zen的JCG合作伙伴Brian Du Preez 是IT领域的合作伙伴, 在收集JDK中最常见的设计模式方面做得非常出色。 模式列表的确令人印象深刻且很长,因此让我们不再ba不休,然后将其呈现给您。

前几天,我在Enterprise Dev上看到了Rob Williams Brain Drain的文章(更多是之作)。 我必须说,我同意他所说的一些话。 从我的亲身经历中我知道,我花了大约2年左右的时间才沉迷于企业开发领域,没有学习任何东西,实际上却失去了之前开发的技能。 公司面临的领域不利于急切的技术人员。

他在这篇文章中还指出:

“十分之一的测试甚至无法通过简单的测试,例如'在流库中使用哪种设计模式可以使BufferedReader与FileReader互换?'”

我也在工作中进行了测试,在8个人中只有1个人要求正确

在没有太大信心的情况下,我猜想Decorator是基于“可互换的”。 然后,我认为这实际上是值得在将来的采访中偷偷摸摸的,并且可能是修改一下的好时机。

因此,我去互联网上寻找有关该主题的所有信息,但实际上却没有找到我想的那么多。 它大部分来自Stackoverflow的 BalusC,其余的则非常分散在博客文章,java牧场,一些旧的pdf以及我的文章之间。 我没有采用发现的每个模式的每个示例,而是使用了常见的模式。

这可能是人们学习模式的好方法,很多时候他们每天都在不知不觉中使用它们。

结构性

适配器
这用于将编程接口/类转换为另一个。

  • 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()


这将抽象与抽象操作的实现分离开来,因此抽象及其实现可以独立变化。

  • AWT(它提供了抽象层,该抽象层将窗口支持映射到本机OS。)
  • JDBC

复合材料
让客户统一对待单个对象和对象组成。 因此换句话说,类型上的方法接受相同的类型。

  • 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)

装饰器
动态地将附加职责附加到对象,因此它也是子类化的替代方法。 在创建类型传递相同类型时可以看到。 实际上,这在整个JDK中都使用了,您看的越多,发现的越多,因此下面的列表绝对不完整。

  • java.io.BufferedInputStream(InputStream)
  • java.io.DataInputStream(InputStream)
  • java.io.BufferedOutputStream(OutputStream)
  • java.util.zip.ZipOutputStream(OutputStream)
  • java.util.Collections#checked [List | Map | Set | SortedSet | SortedMap]()

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

  • java.lang.Class
  • javax.faces.webapp.FacesServlet

飞行重量
缓存以有效地支持大量较小的对象。 几个月前,我偶然发现了Apon。

  • java.lang.Integer#valueOf(int)
  • java.lang.Boolean#valueOf(boolean)
  • java.lang.Byte#valueOf(byte)
  • java.lang.Character#valueOf(char)

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

  • java.lang.reflect.Proxy
  • RMI

创造力的

抽象工厂
提供创建相关或从属对象族的合同,而不必指定其具体类。 它使人们能够将应用程序与正在使用的整个框架的具体实现脱钩。 在整个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()

建造者
通过定义一个目的是构建另一个类的实例的类,可以简化复杂对象的创建过程。 构建器模式还允许实现Fluent接口。

  • java.lang.StringBuilder#append()
  • java.lang.StringBuffer#append()
  • java.sql.PreparedStatement
  • javax.swing.GroupLayout.Group#addComponent()

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

  • 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()

原型
允许其实例可以创建其自身副本的类。 当创建类的实例以某种方式非常耗时或复杂时,可以使用此方法,而不必创建新的实例,而是可以复制原始实例并对其进行修改。

  • java.lang.Object#clone()
  • java.lang.Cloneable

单身人士
这试图确保只有一个类的实例。 我没有找到示例,但是另一个解决方案是使用Joshua Bloch在Effective Java中建议的Enum。

  • java.lang.Runtime#getRuntime()
  • java.awt.Toolkit#getDefaultToolkit()
  • java.awt.GraphicsEnvironment#getLocalGraphicsEnvironment()
  • java.awt.Desktop#getDesktop()

行为的

责任链
通过将请求从链中的一个对象传递到下一个对象,直到对象被识别为止,从而允许对象之间的解耦。 链中的对象是同一接口或抽象类的不同实现。

  • java.util.logging.Logger#log()
  • javax.servlet.Filter#doFilter()

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

  • java.lang.Runnable
  • javax.swing.Action

口译员
此模式通常描述为该语言定义语法并使用该语法解释该格式的语句。

  • java.util.Pattern
  • java.text.Normalizer
  • java.text.Format

迭代器
提供一致的方式来顺序访问独立于基础集合且与基础集合分离的集合中的项目。

  • java.util.Iterator
  • java.util.Enumeration

调解员
通过引入管理消息分发的单个对象,用于减少类之间的直接依赖关系的数量。

  • java.util.Timer
  • java.util.concurrent.Executor#execute()
  • java.util.concurrent.ExecutorService#submit()
  • java.lang.reflect.Method#invoke()

纪念品
这是对象状态的快照,因此该对象可以返回其原始状态,而不必透露其内容。 Date通过内部实际上具有长值来实现此目的。

  • java.util.Date
  • java.io.Serializable

空对象
通过提供替代的“不执行任何操作”行为,可以将其用于封装不存在的对象。 它允许您抽象空对象的处理。

  • java.util.Collections#emptyList()
  • java.util.Collections#emptyMap()
  • java.util.Collections#emptySet()

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

  • java.util.EventListener
  • javax.servlet.http.HttpSessionBindingListener
  • javax.servlet.http.HttpSessionAttributeListener
  • javax.faces.event.PhaseListener

状态
这使您可以在运行时根据内部状态轻松更改对象的行为。

  • java.util.Iterator
  • javax.faces.lifecycle.LifeCycle#execute()

策略
旨在提供一种定义一系列算法的方法,将每个算法封装为一个对象。 然后可以灵活地传递它们以更改功能。

  • java.util.Comparator#compare()
  • javax.servlet.http.HttpServlet
  • javax.servlet.Filter#doFilter()

模板方法
允许子类重写方法的某些部分而不重写它,还允许您控制需要重写哪些操作的子类。

  • java.util.Collections#sort()
  • java.io.InputStream#skip()
  • java.io.InputStream#read()
  • java.util.AbstractList#indexOf()

访客
提供一种易于维护的简便方法来执行一系列课程的操作。 访客集中了行为,并允许在不更改其操作的类的情况下对其进行修改或扩展。

  • javax.lang.model.element.Element和javax.lang.model.element.ElementVisitor
  • javax.lang.model.type.TypeMirror和javax.lang.model.type.TypeVisitor

好是好人的敌人!

拜伦

相关文章:


翻译自: https://www.javacodegeeks.com/2011/03/design-patterns-in-jdk.html

jdk中的设计模式

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

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

相关文章

python鼠标选中事件_python对绑定事件的鼠标、按键的判断实例

当多个事件绑定了同一个命令,那么在命令内部根据不同的事件进行处理的时候,怎么确定哪个事件发生了呢,用下面的来检测,经过测试处理tab键和alt键不能识别,其他单个都能被识别。还有个事件的type属性,这个经…

PAT 1074. Reversing Linked List (25)

Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K 3, then you must output 3→2→1→6→5→4; if K 4, you must output 4→3→2→1→5→6. Input Sp…

jOOQ,H2和Maven入门

本文是我们学院课程的一部分,标题为jOOQ –类型安全的数据库查询 。 在SQL和特定关系数据库很重要的Java应用程序中,jOOQ是一个不错的选择。 当JPA / Hibernate抽象过多,JDBC过多时,这是一种替代方法。 它显示了一种现代的领域特…

sqlserver迁移数据到mysql_SQLServer数据库之将ABP的数据库从SQLSERVER迁移到MySql

本文主要向大家介绍了SQLServer数据库之将ABP的数据库从SQLSERVER迁移到MySql,通过具体的内容向大家展现,希望对大家学习SQLServer数据库有所帮助。安装MySql.Data.Entity然后你需要安装 MySql.Data.Entity和 MySql.Data 到你的 .EntityFramework 和 .We…

查询SQL中某表里有多少列包含某字段

select c.namefrom SYSCOLUMNS as c left join SYSOBJECTS as t on c.idt.id where c.name like 这里是某个字段% and t.name这里是表名 转载于:https://www.cnblogs.com/qiywtc/p/3719087.html

php与mysql连接程序_PHP与Mysql连接

首先请确保LAMP环境完全配置成功,否则请猛击我!然后通过mysql的密码登陆到phpMyAdmin,在浏览器中输入http://127.0.0.1/phpMyAdmin登陆后就像是这样:首先我们来创建一个用于测试的数据库。偷懒的话直接在phpMyAdmin中创建就可以了…

java自动gc_具有Java 7中自动资源管理功能的GC

java自动gc这篇文章简要概述了Java 7中引入的称为自动资源管理或ARM的新功能。 文章探讨了ARM如何减少开发人员为有效释放分配的资源的JVM堆而必须编写的代码。 Java编程语言中编程的最甜蜜之处之一是对象取消分配的自动处理。 在Java世界中,这通常被称为垃圾收集。…

ASP.NET 程序优化

一、SqlDataRead和Dataset的选择 Sqldataread优点:读取数据非常快。如果对返回的数据不需做大量处理的情况下,建议使用SqlDataReader,其性能要比datset好很多。缺点:直到数据读完才可close掉于数据库的连接 (SqlDataReader 读数据…

python pandas excel数据处理_Python处理Excel数据-pandas篇

Python处理Excel数据-pandas篇非常适用于大量数据的拼接、清洗、筛选及分析在计算机编程中,pandas是Python编程语言的用于数据操纵和分析的软件库。特别是,它提供操纵数值表格和时间序列的数据结构和运算操作。它的名字衍生自术语“面板数据”(panel dat…

Proe Top-Down设计演示

前段时间有网友问我,proe 里面有没有装配设计中当某一零件尺寸需要修改时, 与其相关的零件尺寸都需要随之做相应改变的法子。我认为top-down是很好的选择。 下面介绍一下top-down的理论: 就按照产品的功能要求先定义产品架构并考虑组件与零件…

spring和maven_具有Spring和Maven教程的JAX–WS

spring和mavenSpring框架通过JAX-WS提供对Web服务的远程支持,实际上,如Spring 参考文档中所述 ,有三种将Spring POJO服务公开为JAX-WS Web服务的方式: 公开基于Servlet的Web服务(适用于Java EE 5环境) 导…

python映射实体类_【HIBERNATE框架开发之二】第一个HIBERNATE-ANNONATION项目(采用@ENTITY、@ID直接映射实体类)...

紧接上一篇,这里Himi直接copy上一篇创建的HelloHibernate项目,然后改名为:HelloAnnonation,Ok;OK,准备工作:首先第一步,继续再我们自定义的user libraries 中添加Annotation所需的包&#xff0c…

Union-SQL Server学习笔记

1、简单笔记 数据库查询语句中,通过UNION组合查询语句,可以将两个或更多查询的结果组合为单个结果集,该结果集包含组合查询中的所有查询的全部行。 利用UNION语句可以实现将不同数据表中符合条件,不同列种的数据信息,显…

从Java集成Active Directory

首先,您将需要设置Active Directory,以便可以运行和测试代码。 如果(像我一样)没有一台装有Windows Server的计算机,那么即使在Mac OSX上,也可以通过这种方法设置Active Directory。 您要做的第一件事是在…

编译 php mysql 依赖包_MySQL 5.5.15源码包编译安装

mysql果然是不愧是目前最火的数据库,自从mysql5.5.8之后,mysql的源码包编译安装都要用到cmake来进行编译了,编译的过程没有本质mysql果然是不愧是目前最火的数据库,自从mysql5.5.8之后,mysql的源码包编译安装都要用到c…

云计算之路-阿里云上:基于Xen的IO模型进一步分析“黑色0.1秒”问题

在发现云服务器读取OCS缓存的“黑色0.1秒”是发生在socket读取数据时,而且是发生在读取开始的字节,甚至在socket写数据时(比如写入缓存key)也会出现超过50ms的情况,我们的好奇心被激发到一个新的高度。 根据我们的实测…

Cobertura和Sonar 5.1的问题

最近,我有些麻烦,试图在我的Grails 2.4.4项目中使用Sonar 5.1。 我使用的是Groovy常用的东西: Gmetrics,Codenarc和Cobertura 。 对于Sonar数据库,我使用的是Postgres 9.4 。 声纳跑步者的日志文件给了我这个&#xf…

centos6.4 卸载mysql_彻底删除MYSQL-CENTOS

yum remove mysql mysql-server mysql-libs compat-mysql51rm -rf /var/lib/mysqlrm /etc/my.cnf查看是否还有mysql软件:rpm -qa|grep mysql有的话继续删除RPM方式安装MySQL5.6a. 检查MySQL及相关RPM包,是否安装,如果有安装,则移除…

ARIMA模型建模步骤

ARIMA模型建模步骤一. 绘制时序图判断序列是否有明显的趋势或周期二. 单位根检验检验方法ADFDFGLSPPKPSSERSNP前三种有有关常数与趋势项假设,应用不方便,建议少用。后三种是去除原序列趋势后进行检验,应用方便。原假设6种方法除KPPS外&#x…

WT2605C音频蓝牙语音芯片:单芯片实现蓝牙+MP3+BLE+电话本多功能应用

在当今的电子产品领域,多功能、高集成度成为了一种趋势。各种产品都需要具备多种功能,以满足用户多样化的需求。针对这一市场趋势,唯创知音推出了一款集成了蓝牙、MP3播放、BLE和电话本功能的音频蓝牙语音芯片——WT2605C,实现了单…