JDK中的设计模式

Zen的JCG合作伙伴Brian Du Preez 是IT艺术领域的合作伙伴,他在收集JDK中最常见的设计模式方面做得非常出色。 模式列表确实令人印象深刻且很长,所以让我们不再ba不休,向您展示它。

前几天,我在企业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

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

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

相关文章

414. 第三大的数

给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数 方法一 首先将数组排序,然后通过集合去除重复的元素,最后进行一次判断,选择第三大元素还是最大元素 class Solution {public int thir…

bufferevent 与 socket

http://blog.sina.com.cn/s/blog_56dee71a0100qx4s.html 很多时候,除了响应事件之外,应用还希望做一定的数据缓冲。比如说,写入数据的时候,通常的运行模式是: l 决定要向连接写入一些数据,把数据放入到缓冲…

Codeforces Round #102 (Div. 1) A. Help Farmer 暴力分解

A. Help Farmer题目连接: http://www.codeforces.com/contest/142/problem/A Description Once upon a time in the Kingdom of Far Far Away lived Sam the Farmer. Sam had a cow named Dawn and he was deeply attached to her. Sam would spend the whole summe…

电力电子、电机控制系统的建模和仿真_清华团队研发,首款国产电力电子仿真软件来啦~已捐赠哈工大、海工大、清华使用!...

点击上方电气小青年,关注并星标由于微信改版,只有星标才能及时看到我们的消息哦━━━━━━推荐阅读:《膜拜大神!清华大学电机系2021年接收推荐免试直硕(博)生拟录取名单公示!》《滴滴程序员年薪80万被鄙视不如在二本…

JVM如何处理锁

当我们谈论最新版本的Sun Hotspot Java虚拟机1.6时,当您尝试从java.util.concurrent.locks.Lock实现获取锁或输入同步块时,JVM将执行以下三种锁类型: 有偏见的 :有时即使在并发系统中也没有争用,并且在这种情况下&…

基于node.js及express实现中间件,实现post、get

首先,当然是有必要的环境,安装node,这个我就不多说了。 依赖模块: "express": "^4.13.4", "request": "^2.72.0", "body-parser": "^1.13.3",页面 $.ajax({type: &q…

可视化分析之图表选择

转载于:https://www.cnblogs.com/yymn/p/4783631.html

定义并调用函数输出 fibonacci 序列_科学网—Zmn-0351 薛问天:再谈数学概念的定义,评新华先生《0345》...

Zmn-0351 薛问天:再谈数学概念的定义,评新华先生《0345》【编者按。下面是薛问天先生发来的文章。是对《Zmn-0345》新华先生文章的评论。现在发布如下,供网友们共享。请大家关注并积极评论。另外本《专栏》重申,这里纯属学术讨论&…

Java和内存泄漏

总览 术语“内存泄漏”在Java中的使用方式不同于在其他语言中使用的方式。 通用术语中的“内存泄漏”是什么意思,在Java中如何使用? 维基百科的定义 当计算机程序消耗内存但无法将其释放回操作系统时,就会发生计算机科学中的内存泄漏&#x…

453. 最小操作次数使数组元素相等

给你一个长度为 n 的整数数组&#xff0c;每次操作将会使 n - 1 个元素增加 1 。返回让数组所有元素相等的最小操作次数。 class Solution {public int minMoves(int[] nums) {int res 0;int sum 0;int n nums.length;for(int i 0;i<n;i){sum nums[i];}res sum - min…

第二章 TCP/IP 基础知识

第二章 TCP/IP 基础知识 TCP/IP transmission control protocol and ip internet protocol 是互联网众多通信协议中最为著名的。 2.2 TCP/IP 的标准化 2.2.2 TCP/IP 标准化精髓 TCP/IP 协议始终具有很强的实用性。 相比于TCP/IP &#xff0c;OSI 之所以未能达到普及&#xff0…

CSS太阳月亮地球三角恋旋转效果

纯粹玩一下&#xff0c;好像没有什么实际的卵用&#xff0c;but&#xff0c;纯玩买不了上当&#xff0c;纯玩买不了受骗。。。。。。。。 地月旋转的一个css效果&#xff0c;无聊玩玩&#xff0c;可以复制到记事本试试 <!DOCTYPE html><html lang"en">&l…

gorm preload 搜索_LeetCode刷题笔记|95:不同的二叉搜索树 II

题目描述给定一个整数 n&#xff0c;生成所有由 1 ... n 为节点所组成的 二叉搜索树 。示例输入&#xff1a;3输出&#xff1a;[[1,null,3,2],[3,2,null,1],[3,1,null,null,2],[2,1,3],[1,null,2,null,3]]解释&#xff1a;以上的输出对应以下 5 种不同结构的二叉搜索树&#xf…

Java初学者指南

Java编程的第一步。 对于Java中的入门教程&#xff0c;请参阅Sun的官方帮助这里 除了核心语言外&#xff0c;还有几种技术和API 介绍。 我们建议首先阅读涵盖 基础知识&#xff0c;并继续其余的教程。 我们建议&#xff1a; 保持代码简单易读 拆分逻辑组件&#xff08;类…

Javascript中Promise对象的实现

http://segmentfault.com/a/1190000000684654 http://www.infoq.com/cn/news/2011/09/js-promise/转载于:https://www.cnblogs.com/zuiyirenjian/p/4787864.html

字符串分割与存入List集合

List<string> namelist new List<string>(); string[] namejh null; string name "张三李四王五"; 第一步&#xff1a;将三个名字分离出来 namejh name.Split("".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); namelist new Li…

GTJ2018如何导出全部工程量_如何成为优秀的造价员?广联达编制内刊手册,造价员算量高手秘籍...

如何成为优秀的造价员&#xff1f;广联达编制内刊手册&#xff0c;造价员算量高手秘籍[高手秘籍]是广联达课程编制委员会暨直播委员会精心打造的&#xff0c;能够“让您深入理解软件计算、设置等原理,遇到问题有处理思路,以常见问题为导向&#xff0c;重点进行原因分析&#xf…

带有Spring,Hibernate,Akka,Twitter Bootstrap,Apache Tiles和jQuery的Maven Web项目Kickstarter代码库...

我很高兴将第二个项目上传到GitHub&#xff0c;以帮助人们尽快开始Java Web App开发。 我正在与Apache License 2.0共享此代码。 这是相同的网址&#xff1a; https://github.com/ykameshrao/spring-hibernate-springdata-springmvc-maven-project-framework 该项目包括以下部…

git项目添加.gitigore文件

以前一直没有注意这个文件&#xff0c;最近读到了黄勇的《架构探险》&#xff0c;觉得这个文件还是很有用的。 .gitigore文件可以自己配置。 我使用的是书中所用的配置&#xff0c;简洁明了。 # Maven # target/#log# logs/# IDEA # .idea/ *.iml# Eclipse # .settings/ .metad…

463. 岛屿的周长

给定一个 row x col 的二维网格地图 grid &#xff0c;其中&#xff1a;grid[i][j] 1 表示陆地&#xff0c; grid[i][j] 0 表示水域。 网格中的格子 水平和垂直 方向相连&#xff08;对角线方向不相连&#xff09;。整个网格被水完全包围&#xff0c;但其中恰好有一个岛屿&a…