23个经典JDK设计模式(转)

下面是JDK中有关23个经典设计模式的示例:

Structural(结构模式)

Adapter:

把一个接口或是类变成另外一种。

o    ● java.util.Arrays#asList()

o    ● javax.swing.JTable(TableModel)

o    ● java.io.InputStreamReader(InputStream)

o    ● java.io.OutputStreamWriter(OutputStream)

o    ● javax.xml.bind.annotation.adapters.XmlAdapter#marshal()

o    ● javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal()

Bridge:

把抽象和实现解藕,于是接口和实现可在完全独立开来。

o    ● AWT (提供了抽象层映射于实际的操作系统)

o    ● JDBC

Composite:

让使用者把单独的对象和组合对象混用。

o    ● javax.swing.JComponent#add(Component)

o    ● java.awt.Container#add(Component)

o    ● java.util.Map#putAll(Map)

o    ● java.util.List#addAll(Collection)

o    ● java.util.Set#addAll(Collection)

Decorator:

为一个对象动态的加上一系列的动作,而不需要因为这些动作的不同而产生大量的继承类。这个模式在JDK中几乎无处不在,所以,下面的列表只是一些典型的。

o    ● java.io.BufferedInputStream(InputStream)

o    ● java.io.DataInputStream(InputStream)

o    ● java.io.BufferedOutputStream(OutputStream)

o    ● java.util.zip.ZipOutputStream(OutputStream)

o    ● java.util.Collections#checked[List|Map|Set|SortedSet|SortedMap]()

Facade:

用一个简单的接口包状一组组件,接口,抽象或是子系统。

o    ● java.lang.Class

o    ● javax.faces.webapp.FacesServlet

Flyweight:

有效率地存储大量的小的对象。

o    ● java.lang.Integer#valueOf(int)

o    ● java.lang.Boolean#valueOf(boolean)

o    ● java.lang.Byte#valueOf(byte)

o    ● java.lang.Character#valueOf(char)

Proxy:

用一个简单的对象来代替一个复杂的对象。

o    ● java.lang.reflect.Proxy

o    ● RMI

Creational(创建模式)

Abstract factory:

创建一组有关联的对象实例。这个模式在JDK中也是相当的常见,还有很多的framework例如Spring。我们很容易找到这样的实例。

o    ● java.util.Calendar#getInstance()

o    ● java.util.Arrays#asList()

o    ● java.util.ResourceBundle#getBundle()

o    ● java.sql.DriverManager#getConnection()

o    ● java.sql.Connection#createStatement()

o    ● java.sql.Statement#executeQuery()

o    ● java.text.NumberFormat#getInstance()

o    ● javax.xml.transform.TransformerFactory#newInstance()

Builder:

主要用来简化一个复杂的对象的创建。这个模式也可以用来实现一个 Fluent Interface。

o    ● java.lang.StringBuilder#append()

o    ● java.lang.StringBuffer#append()

o    ● java.sql.PreparedStatement

o    ● javax.swing.GroupLayout.Group#addComponent()

Factory:

简单来说,按照需求返回一个类型的实例。

o    ● java.lang.Proxy#newProxyInstance()

o    ● java.lang.Object#toString()

o    ● java.lang.Class#newInstance()

o    ● java.lang.reflect.Array#newInstance()

o    ● java.lang.reflect.Constructor#newInstance()

o    ● java.lang.Boolean#valueOf(String)

o    ● java.lang.Class#forName()

Prototype:

使用自己的实例创建另一个实例。有时候,创建一个实例然后再把已有实例的值拷贝过去,是一个很复杂的动作。所以,使用这个模式可以避免这样的复杂性。

o    ● java.lang.Object#clone()

o    ● java.lang.Cloneable

Singleton:

只允许一个实例。在Effective Java中建议使用Emun.

o    ● java.lang.Runtime#getRuntime()

o    ● java.awt.Toolkit#getDefaultToolkit()

o    ● java.awt.GraphicsEnvironment#getLocalGraphicsEnvironment()

o    ● java.awt.Desktop#getDesktop()

Behavioral(行为模式)

Chain of responsibility:

把一个对象在一个链接传递直到被处理。在这个链上的所有的对象有相同的接口(抽象类)但却有不同的实现。

o    ● java.util.logging.Logger#log()

o    ● javax.servlet.Filter#doFilter()

Command:

把一个或一些命令封装到一个对象中。

o    ● java.lang.Runnable

o    ● javax.swing.Action

Interpreter:

一个语法解释器的模式。

o    ● java.util.Pattern

o    ● java.text.Normalizer

o    ● java.text.Format

Iterator:

提供一种一致的方法来顺序遍历一个容器中的所有元素。

o    ● java.util.Iterator

o    ● java.util.Enumeration

Mediator:

用来减少对象单的直接通讯的依赖关系。使用一个中间类来管理消息的方向。

o    ● java.util.Timer

o    ● java.util.concurrent.Executor#execute()

o    ● java.util.concurrent.ExecutorService#submit()

o    ● java.lang.reflect.Method#invoke()

Memento:

给一个对象的状态做一个快照。Date类在内部使用了一个long型来做这个快照。

o    ● java.util.Date

o    ● java.io.Serializable

Null Object:

这个模式用来解决如果一个Collection中没有元素的情况。

o    ● java.util.Collections#emptyList()

o    ● java.util.Collections#emptyMap()

o    ● java.util.Collections#emptySet()

Observer:

允许一个对象向所有的侦听的对象广播自己的消息或事件。

o    ● java.util.EventListener

o    ● javax.servlet.http.HttpSessionBindingListener

o    ● javax.servlet.http.HttpSessionAttributeListener

o    ● javax.faces.event.PhaseListener

State:

这个模式允许你可以在运行时很容易地根据自身内部的状态改变对象的行为。

o    ● java.util.Iterator

o    ● javax.faces.lifecycle.LifeCycle#execute()

Strategy:

定义一组算法,并把其封装到一个对象中。然后在运行时,可以灵活的使用其中的一个算法。

o    ● java.util.Comparator#compare()

o    ● javax.servlet.http.HttpServlet

o    ● javax.servlet.Filter#doFilter()

Template method:

允许子类重载部分父类而不需要完全重写。

o    ● java.util.Collections#sort()

o    ● java.io.InputStream#skip()

o    ● java.io.InputStream#read()

o    ● java.util.AbstractList#indexOf()

Visitor:

作用于某个对象群中各个对象的操作. 它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作.

o    ● javax.lang.model.element.Element 和javax.lang.model.element.ElementVisitor

o    ● javax.lang.model.type.TypeMirror 和javax.lang.model.type.TypeVisitor

原址:http://www.open-open.com/lib/view/open1406270413085.html

时间: 2024-08-24 20:18:33

23个经典JDK设计模式(转)的相关文章

(经常看看)jdk 设计模式

在JDK(Java Development Kit)类库中,开发人员使用了大量设计模式,正因为如此,我们可以在不修改JDK源码的前提下开发出自己的应用软件,本文列出了部分JDK中的模式应用实例,有兴趣的童鞋可以深入研究,看看前Sun公司的开发人员是如何在实际框架开发中运用设计模式的,,Sunny认为,研究JDK类库中的模式实例也不失为学习如何使用设计模式的一个好方式,. 创建型模式: (1) 抽象工厂模式(Abstract Factory) • java.util.Calendar#getIns

JDK设计模式之——装饰者模式(适配器模式)

假定已经有三个类A,B和C他们的继承关系如下          ClassA Class B extends A  Class C extends A  想进一步扩展类B和类C的功能,新增三个方法 method1(). method2(). method3(). 要求 类B和类C 满足 可能新增一个方法,两个方法,或者三个方法 用继承扩展(缺点很大) 解决办法,用继承关系 给B写7个子类(3个方法的排列组合 2的三次方-1) 给A也写三个子类. 采用继承的方式扩展B类和C类的功能,会导致子类的数

GOF 的23种JAVA常用设计模式总结 01 设计模式的概念分类和功能

1.简介 软件设计模式(Software Design Pattern),又称设计模式,是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案.也就是说,它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用.其目的是为了提高代码的可重用性.代码的可读性和代码的可靠性. 2.设计模式的分类 根据模式的目的分类 根据模式的作用范围分类 3.根据目的分类 创建型模式:特点:将对象的

GOF 的23种JAVA常用设计模式总结 03 面向对象七大设计原则

在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据 7 条原则来开发程序,从而提高软件开发效率.节约软件开发成本和维护成本. 各位代码界的大佬们总结出的七大设计原则,还是需要好好了解一下 1.开闭原则 开闭原则(Open Closed Principle,OCP)由勃兰特·梅耶(Bertrand Meyer)提出,他在 1988 年的著作<面向对象软件构造>(Object Oriented Software Construction)中提出:软件实

JDK设计模式之——责任链

责任链的设计模式可以参考Servlet的FilterChain.FilterChain中的每个Filter(过滤器)就像一个个的链条 接口Filter doFilter(ServletRequest request, ServletResponse response, FilterChain chain)           The doFilter method of the Filter is called by the container each time a request/respo

对几种常见设计模式的理解

 转自:  http://blog.csdn.net/dengpeng0419/article/details/48110841 设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 最早提出"设计模式"概念的是建筑设计大师亚力山大Alexander.在1970年他的<建筑的永恒之道>里描述了投计模式的发现,因为它已经存在了千百年之久,而现代才被通过大量的研究而被发现.在<建

zz从面向对象的设计模式看软件设计

原贴:https://coolshell.cn/articles/8961.html 前些天发了一篇<如此理解面向对象编程>的文章,然后引起了大家的热议.然后我在微博上说了一句--"那23个经典的设计模式和OO半毛钱关系没有,只不过人家用OO来实现罢了--OO的设计模式思想和Unix的设计思想基本没什么差别",结果引来了一点点争议.所以,我写下这篇文章把我的观点说明一下.我希望这样可以让大家更容易地理解什么是设计模式.我顺便帮OO和 Unix/Linux搞搞基. 什么是模式

什么是设计模式?常见的设计模式有哪些?

设计模式是众多软件开发人员经过长期的软件开发过程中总结得来的.针对的一般性问题的通用解决方案,是一套被分类编目的.软件开发人员都知晓的.可被反复利用的.代码设计经验的总结. 使用设计模式可以提高代码的复用.避免程序大量修改从而保证代码的可靠性,同时使代码更容易被他人理解.显然设计模式不管是对自己.对他人还是对系统都是有益的,设计模式使得代码编制真正的工程化,是软件工程的基石. 在Gang of Four中总结了23种经典的设计模式,常用的设计模式有:单例模式.工厂模式.观察者模.适配器模式.亨元

从一些简单代码实例彻底理解面向对象编程思想|OOP本质是什么?

从Rob Pike 的 Google+上的一个推看到了一篇叫<Understanding Object Oriented Programming>的文章,我先把这篇文章简述一下,然后再说说老牌黑客Rob Pike的评论. 先看这篇教程是怎么来讲述OOP的.它先给了下面这个问题,这个问题需要输出一段关于操作系统的文字:假设Unix很不错,Windows很差. 这个把下面这段代码描述成是Hacker Solution.(这帮人觉得下面这叫黑客?我估计这帮人真是没看过C语言的代码) 1 2 3 4