JDK中的设计模式

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

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

他在这篇文章中还指出:

“十分之一的测试无法通过像'流库中使用哪种设计模式使BufferedReaderFileReader可互换的简单测试?'”

我也在工作中进行了测试,在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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值