自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

簡述JDK里的23個經(jīng)典設(shè)計模式

開發(fā) 后端
本文轉(zhuǎn)自著名開發(fā)者陳皓的博文,講述的是JDK中有關(guān)23個經(jīng)典設(shè)計模式的示例,以及在stakeoverflow也有相應(yīng)的討論。

本文總結(jié)了JDK中有關(guān)23個經(jīng)典設(shè)計模式的示例,在stakeoverflow也有相應(yīng)的討論:

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:

把抽象和實現(xiàn)解藕,于是接口和實現(xiàn)可在完全獨立開來。

AWT (提供了抽象層映射于實際的操作系統(tǒng))

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:

為一個對象動態(tài)的加上一系列的動作,而不需要因為這些動作的不同而產(chǎn)生大量的繼承類。這個模式在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:

用一個簡單的接口包狀一組組件,接口,抽象或是子系統(tǒng)。

  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:

用一個簡單的對象來代替一個復(fù)雜的對象。

  1. java.lang.reflect.Proxy  
  2.  

RMI

Creational(創(chuàng)建模式)

Abstract factory:

創(chuàng)建一組有關(guān)聯(lián)的對象實例。這個模式在JDK中也是相當(dāng)?shù)某R?,還有很多的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:

主要用來簡化一個復(fù)雜的對象的創(chuàng)建。這個模式也可以用來實現(xiàn)一個 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:

使用自己的實例創(chuàng)建另一個實例。有時候,創(chuàng)建一個實例然后再把已有實例的值拷貝過去,是一個很復(fù)雜的動作。所以,使用這個模式可以避免這樣的復(fù)雜性。

  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:

把一個對象在一個鏈接傳遞直到被處理。在這個鏈上的所有的對象有相同的接口(抽象類)但卻有不同的實現(xiàn)。

  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:

用來減少對象單的直接通訊的依賴關(guān)系。使用一個中間類來管理消息的方向。

  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:

給一個對象的狀態(tài)做一個快照。Date類在內(nèi)部使用了一個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:

這個模式允許你可以在運行時很容易地根據(jù)自身內(nèi)部的狀態(tài)改變對象的行為。

  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.  

 

責(zé)任編輯:張攀 來源: coolshell
相關(guān)推薦

2020-10-14 13:58:14

23種設(shè)計模式速記

2024-05-30 12:27:42

Python代碼

2009-07-07 16:39:40

JDK Observe

2009-06-22 16:34:30

框架架構(gòu)設(shè)計模式

2009-01-04 13:49:17

Java設(shè)計模式設(shè)計模式工廠模式

2023-10-19 13:43:00

設(shè)計模式軟件設(shè)計

2012-05-28 09:16:12

Java設(shè)計模式

2009-06-18 10:13:00

Java設(shè)計模式

2021-06-08 06:46:48

設(shè)計模式創(chuàng)建型

2024-12-13 08:28:45

設(shè)計模式依賴

2024-10-29 16:13:04

Python字典API

2017-03-20 18:03:51

2019-04-24 09:43:46

代碼開發(fā)工具

2024-08-16 13:59:00

2020-07-30 08:10:08

框架設(shè)計Spring Secu

2011-12-27 10:17:56

JDKJava

2023-03-03 13:10:15

2022-10-30 17:32:25

設(shè)計模式單例模式

2009-07-10 11:02:17

WebWork參數(shù)配置

2022-08-24 14:14:58

JavaScript函數(shù)
點贊
收藏

51CTO技術(shù)棧公眾號