jdk中的设计模式_JDK中的设计模式
jdk中的設計模式
Zen的JCG合作伙伴Brian Du Preez 是IT領域的合作伙伴, 在收集JDK中最常見的設計模式方面做得非常出色。 模式列表的確令人印象深刻且很長,因此讓我們不再ba不休,然后將其呈現(xiàn)給您。前幾天,我在Enterprise Dev上看到了Rob Williams Brain Drain的文章(更多是之作)。 我必須說,我同意他所說的一些話。 從我的親身經(jīng)歷中我知道,我花了大約2年左右的時間才沉迷于企業(yè)開發(fā)領域,沒有學習任何東西,實際上卻失去了之前開發(fā)的技能。 公司面臨的領域不利于急切的技術人員。
他在這篇文章中還指出:
“十分之一的測試甚至無法通過簡單的測試,例如'在流庫中使用哪種設計模式可以使BufferedReader與FileReader互換?'”
我也在工作中進行了測試,在8個人中只有1個人要求正確
在沒有太大信心的情況下,我猜想Decorator是基于“可互換的”。 然后,我認為這實際上是值得在將來的采訪中偷偷摸摸的,并且可能是修改一下的好時機。
因此,我去互聯(lián)網(wǎng)上尋找有關該主題的所有信息,但實際上卻沒有找到我想的那么多。 它大部分來自Stackoverflow的 BalusC,其余的則非常分散在博客文章,java牧場,一些舊的pdf以及我的文章之間。 我沒有采用發(fā)現(xiàn)的每個模式的每個示例,而是使用了常見的模式。
這可能是人們學習模式的好方法,很多時候他們每天都在不知不覺中使用它們。
結構性
適配器 :
這用于將編程接口/類轉(zhuǎn)換為另一個。
- 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()
橋 :
這將抽象與抽象操作的實現(xiàn)分離開來,因此抽象及其實現(xiàn)可以獨立變化。
- AWT(它提供了抽象層,該抽象層將窗口支持映射到本機OS。)
- JDBC
復合材料 :
讓客戶統(tǒng)一對待單個對象和對象組成。 因此換句話說,類型上的方法接受相同的類型。
- 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)
裝飾器 :
動態(tài)地將附加職責附加到對象,因此它也是子類化的替代方法。 在創(chuàng)建類型傳遞相同類型時可以看到。 實際上,這在整個JDK中都使用了,您看的越多,發(fā)現(xiàn)的越多,因此下面的列表絕對不完整。
- 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]()
外墻 :
為一組組件,接口,抽象或子系統(tǒng)提供簡化的接口。
- java.lang.Class
- javax.faces.webapp.FacesServlet
飛行重量 :
緩存以有效地支持大量較小的對象。 幾個月前,我偶然發(fā)現(xiàn)了Apon。
- java.lang.Integer#valueOf(int)
- java.lang.Boolean#valueOf(boolean)
- java.lang.Byte#valueOf(byte)
- java.lang.Character#valueOf(char)
代理人 :
代理模式用于用較簡單的對象表示創(chuàng)建復雜或耗時的對象。
- java.lang.reflect.Proxy
- RMI
創(chuàng)造力的
抽象工廠 :
提供創(chuàng)建相關或從屬對象族的合同,而不必指定其具體類。 它使人們能夠?qū)贸绦蚺c正在使用的整個框架的具體實現(xiàn)脫鉤。 在整個JDK和許多類似Spring的框架中也可以找到它。 它們很容易發(fā)現(xiàn),可以用于創(chuàng)建對象但仍返回接口或抽象類的任何方法。
- 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()
建造者 :
通過定義一個目的是構建另一個類的實例的類,可以簡化復雜對象的創(chuàng)建過程。 構建器模式還允許實現(xiàn)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()
原型 :
允許其實例可以創(chuàng)建其自身副本的類。 當創(chuàng)建類的實例以某種方式非常耗時或復雜時,可以使用此方法,而不必創(chuàng)建新的實例,而是可以復制原始實例并對其進行修改。
- 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()
行為的
責任鏈 :
通過將請求從鏈中的一個對象傳遞到下一個對象,直到對象被識別為止,從而允許對象之間的解耦。 鏈中的對象是同一接口或抽象類的不同實現(xiàn)。
- 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
調(diào)解員 :
通過引入管理消息分發(fā)的單個對象,用于減少類之間的直接依賴關系的數(shù)量。
- java.util.Timer
- java.util.concurrent.Executor#execute()
- java.util.concurrent.ExecutorService#submit()
- java.lang.reflect.Method#invoke()
紀念品
這是對象狀態(tài)的快照,因此該對象可以返回其原始狀態(tài),而不必透露其內(nèi)容。 Date通過內(nèi)部實際上具有長值來實現(xiàn)此目的。
- java.util.Date
- java.io.Serializable
空對象 :
通過提供替代的“不執(zhí)行任何操作”行為,可以將其用于封裝不存在的對象。 它允許您抽象空對象的處理。
- 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
狀態(tài) :
這使您可以在運行時根據(jù)內(nèi)部狀態(tài)輕松更改對象的行為。
- 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()
訪客 :
提供一種易于維護的簡便方法來執(zhí)行一系列課程的操作。 訪客集中了行為,并允許在不更改其操作的類的情況下對其進行修改或擴展。
- javax.lang.model.element.Element和javax.lang.model.element.ElementVisitor
- javax.lang.model.type.TypeMirror和javax.lang.model.type.TypeVisitor
好是好人的敵人!
拜倫
相關文章:
- 每個程序員都應該知道的事情
- 正確記錄應用程序的10個技巧
- 軟件設計法則
- Java最佳實踐系列
- 生存在荒野西部開發(fā)過程中的9條提示
翻譯自: https://www.javacodegeeks.com/2011/03/design-patterns-in-jdk.html
jdk中的設計模式
總結
以上是生活随笔為你收集整理的jdk中的设计模式_JDK中的设计模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 狗篮子什么意思 狗篮子如何解释
- 下一篇: jOOQ,H2和Maven入门