前幾天,我在企業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