jdk中的设计模式_JDK中的设计模式
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中的设计模式
jdk中的设计模式_JDK中的设计模式相关推荐
- 【设计模式系列20】解释器模式原理及其在JDK和Spring源码中的体现
解释器模式原理及其在JDK源码中的体现 设计模式系列总览 前言 什么是解释器模式 终结符表达式和非终结符表达式 解释器模式示例 解释器模式角色 解释器模式在JDK和Spring源码中应用 解释器模式应 ...
- 16种JavaScript设计模式(中)
简介 上文中介绍了学习设计模式前需要了解的一些基础概念和js的基础模式-原型模式,没看过的同学可以点这里,本章将介绍以下几种模式 单例模式 策略模式 代理模式 迭代器模式 发布订阅模式 命令模式 组合 ...
- [Head First设计模式]餐馆中的设计模式——命令模式
系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式- ...
- 开发中经常使用的5种设计模式
提到设计模式,很多人都会觉得老生常谈,有些人觉得设计模式很有必要,有些人觉得设计模式没那么重要,那么我们在工作中是否应该重视设计模式呢?我们是否应该将设计模式大量应用到我们的生产过程中呢? 如果你从未 ...
- java观察者设计模式_Java中的观察者设计模式
java观察者设计模式 在本教程中,我们将讨论Observer设计模式. 观察者模式有两个主要方面- 主题和观察者 . 当我们的系统有多个对象(称为观察者)时 ,将使用一个模式,即依赖于一个特定对象( ...
- java 生成器 设计模式_Java中的生成器设计模式
java 生成器 设计模式 Java 中的 Builder设计模式是一种创建模式,即用于创建对象,类似于 工厂方法设计模式 ,这也是创建设计模式. 在学习任何设计模式之前,我建议先找出特定设计模式要解 ...
- scala设计模式_Scala中的工厂设计模式
scala设计模式 I'm going to deliver a series of Scala Design Patterns in my coming posts. I will pick-up ...
- 关于《设计模式》与《设计模式沉思录》中提到的“常露齿嘻笑的猫”(Cheshire Cat)的说明
最近在看GoF的<设计模式>,在此之前看了John Vlissides的<设计模式沉思录>,在"沉思录"P42页脚注中,作者提到 "在C++中这样 ...
- 关于《设计模式》与《设计模式沉思录》中提到的“常露齿嘻笑的猫”(Cheshire Cat)的说明...
最近在看GoF的<设计模式>,在此之前看了John Vlissides的<设计模式沉思录>,在"沉思录"P42页脚注中,作者提到 "在C++中这样 ...
最新文章
- 滑动定位的三种方法,以及热启动(五)
- linux拨号上网的命令,LINUX下ADSL拨号上网
- python npy文件_python实现npy格式文件转换为txt文件操作
- SPI/I2S调试心得与经验总结
- python爬虫之urllib库详解
- (十一)企业部分之nagios
- 安装ccs5.5总出现错误_《西游记》“斗法降三怪”,出现错误而补拍,观众总觉得改过结尾...
- Typescript实现单例之父类调用子类
- win7 64 位用VMware安装Ubantu 20130908
- Qt的工程文件讲解 .pro
- 准确率创新高,北大开源中文分词工具包 pkuseg
- Tabio – 轻松,高效的管理 Chrome 标签页
- windows 下访问bsd系统分区的小工具 ____FFS driver mount manager
- 今天研究成功ASP动态管理数据表及字段
- Unity 2017-2019各个版本unityhub下载连接
- Java基础加强重温_06:可变参数、集合工具类Collections类、冒泡排序、Map集合、Map集合遍历、Map案例、LinkedHashMap集合、图书管理系统
- 计算机资源管理器经常停止运行,windows资源管理器已停止工作一直弹出来彻底解决方案...
- linux实现文件共享的方式,Linux文件共享的实现方式
- nmn是一款什么样的产品,关于nmn产品你会选吗,一起来了解
- python考研选什么专业好就业_人工智能考研专业就业怎么样 哪些院校开设人工智能专业...
热门文章
- PL/SQL编程基本概念
- MyBatis中动态SQL
- 查看防火墙状态并关闭防火墙
- Ajax前后端对接---Springmvc
- RPC远程过程调用之Hessian 基于HTTP
- vue父子组件生命周期顺序_vue父子组件生命周期执行顺序
- 语言 高速公路超速处罚_重磅!全国高速将统一限速,这4种超速不再扣分罚款!【饮茶论道】...
- elementui下拉框选择图片_element ui下拉框如何实现默认选择?
- 关于es查询dsl的filter与must,term与match的区别
- buildpack_使用Buildpack容器化Spring Boot应用程序