简述JDK里的23个经典设计模式

开发 后端
本文转自著名开发者陈皓的博文,讲述的是JDK中有关23个经典设计模式的示例,以及在stakeoverflow也有相应的讨论。

本文总结了JDK中有关23个经典设计模式的示例,在stakeoverflow也有相应的讨论:

Adapter:

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

  1. java.util.Arrays#asList()  
  2.  
  3. javax.swing.JTable(TableModel)  
  4.  
  5. java.io.InputStreamReader(InputStream)  
  6.  
  7. java.io.OutputStreamWriter(OutputStream)  
  8.  
  9. javax.xml.bind.annotation.adapters.XmlAdapter#marshal()  
  10.  
  11. javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal()  
  12.  

Bridge:

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

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

JDBC

Composite:

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

  1. javax.swing.JComponent#add(Component)  
  2.  
  3. java.awt.Container#add(Component)  
  4.  
  5. java.util.Map#putAll(Map)  
  6.  
  7. java.util.List#addAll(Collection)  
  8.  
  9. java.util.Set#addAll(Collection)  
  10.  

Decorator:

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

  1.  
  2.  
  3. java.io.BufferedInputStream(InputStream)  
  4.  
  5. java.io.DataInputStream(InputStream)  
  6.  
  7. java.io.BufferedOutputStream(OutputStream)  
  8.  
  9. java.util.zip.ZipOutputStream(OutputStream)  
  10.  
  11. java.util.Collections#checked[List|Map|Set|SortedSet|SortedMap]()  
  12.  

Facade:

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

  1. java.lang.Class  
  2.  
  3. javax.faces.webapp.FacesServlet  
  4.  

Flyweight:

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

  1. java.lang.Integer#valueOf(int)  
  2.  
  3. java.lang.Boolean#valueOf(boolean)  
  4.  
  5. java.lang.Byte#valueOf(byte)  
  6.  
  7. java.lang.Character#valueOf(char)  
  8.  

Proxy:

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

  1. java.lang.reflect.Proxy  
  2.  

RMI

Creational(创建模式)

Abstract factory:

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

  1. java.util.Calendar#getInstance()  
  2.  
  3. java.util.Arrays#asList()  
  4.  
  5. java.util.ResourceBundle#getBundle()  
  6.  
  7. java.sql.DriverManager#getConnection()  
  8.  
  9. java.sql.Connection#createStatement()  
  10.  
  11. java.sql.Statement#executeQuery()  
  12.  
  13. java.text.NumberFormat#getInstance()  
  14.  
  15. javax.xml.transform.TransformerFactory#newInstance()  
  16.  

Builder:

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

  1. java.lang.StringBuilder#append()  
  2.  
  3. java.lang.StringBuffer#append()  
  4.  
  5. java.sql.PreparedStatement  
  6.  
  7. javax.swing.GroupLayout.Group#addComponent()  
  8.  

Factory:

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

  1. java.lang.Proxy#newProxyInstance()  
  2.  
  3. java.lang.Object#toString()  
  4.  
  5. java.lang.Class#newInstance()  
  6.  
  7. java.lang.reflect.Array#newInstance()  
  8.  
  9. java.lang.reflect.Constructor#newInstance()  
  10.  
  11. java.lang.Boolean#valueOf(String)  
  12.  
  13. java.lang.Class#forName()  
  14.  

Prototype:

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

  1. java.lang.Object#clone()  
  2.  
  3. java.lang.Cloneable  
  4.  

Singleton:

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

  1. java.lang.Runtime#getRuntime()  
  2.  
  3. java.awt.Toolkit#getDefaultToolkit()  
  4.  
  5. java.awt.GraphicsEnvironment#getLocalGraphicsEnvironment()  
  6.  
  7. java.awt.Desktop#getDesktop()  
  8.  

Behavioral(行为模式)

Chain of responsibility:

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

  1. java.util.logging.Logger#log()  
  2.  
  3. javax.servlet.Filter#doFilter()  
  4.  

Command:

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

  1. java.lang.Runnable  
  2.  
  3. javax.swing.Action  
  4.  

Interpreter:

一个语法解释器的模式。

  1. java.util.Pattern  
  2.  
  3. java.text.Normalizer  
  4.  
  5. java.text.Format  
  6.  

Iterator:

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

  1. java.util.Iterator  
  2.  
  3. java.util.Enumeration  
  4.  

Mediator:

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

  1. java.util.Timer  
  2.  
  3. java.util.concurrent.Executor#execute()  
  4.  
  5. java.util.concurrent.ExecutorService#submit()  
  6.  
  7. java.lang.reflect.Method#invoke()  
  8.  

Memento:

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

  1. java.util.Date  
  2.  
  3. java.io.Serializable  
  4.  

Null Object:

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

  1. java.util.Collections#emptyList()  
  2.  
  3. java.util.Collections#emptyMap()  
  4.  
  5. java.util.Collections#emptySet()  
  6.  

Observer:

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

  1. java.util.EventListener  
  2.  
  3. javax.servlet.http.HttpSessionBindingListener  
  4.  
  5. javax.servlet.http.HttpSessionAttributeListener  
  6.  
  7. javax.faces.event.PhaseListener  
  8.  

State:

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

  1. java.util.Iterator  
  2.  
  3. javax.faces.lifecycle.LifeCycle#execute()  
  4.  

Strategy:

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

  1. java.util.Comparator#compare()  
  2.  
  3. javax.servlet.http.HttpServlet  
  4.  
  5. javax.servlet.Filter#doFilter()  
  6.  

Template method:

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

  1. java.util.Collections#sort()  
  2.  
  3. java.io.InputStream#skip()  
  4.  
  5. java.io.InputStream#read()  
  6.  
  7. java.util.AbstractList#indexOf()  
  8.  

Visitor:

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

  1. javax.lang.model.element.Element 和javax.lang.model.element.ElementVisitor  
  2.  
  3. javax.lang.model.type.TypeMirror 和javax.lang.model.type.TypeVisitor  
  4.  

 

责任编辑:张攀 来源: coolshell
相关推荐

2020-10-14 13:58:14

23种设计模式速记

2009-07-07 16:39:40

JDK Observe

2009-06-22 16:34:30

框架架构设计模式

2009-01-04 13:49:17

Java设计模式设计模式工厂模式

2023-10-19 13:43:00

设计模式软件设计

2012-05-28 09:16:12

2021-06-08 06:46:48

设计模式创建型

2009-06-18 10:13:00

2017-03-20 18:03:51

2019-04-24 09:43:46

代码开发工具

2022-10-30 17:32:25

设计模式单例模式

2023-03-03 13:10:15

2020-07-30 08:10:08

框架设计Spring Secu

2011-12-27 10:17:56

JDKJava

2009-07-10 11:02:17

WebWork参数配置

2022-06-16 08:24:59

设计模式代码前端

2022-08-24 14:14:58

JavaScript函数

2024-04-07 08:12:54

设计模式工具

2012-08-27 10:52:20

.NET架构观察者模式

2010-02-25 15:49:05

WCF消息模式
点赞
收藏

51CTO技术栈公众号