jdk中的设计模式
前几天,我在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
好是好人的敌人!
拜伦
相关文章:
- 每个程序员都应该知道的事情
- 正确记录应用程序的10个技巧
- 软件设计法则
- Java最佳实践系列
- 生存在荒野西部开发过程中的9条提示
翻译自: https://www.javacodegeeks.com/2011/03/design-patterns-in-jdk.html
jdk中的设计模式