JDK中的設計模式

Zen的JCG合作伙伴Brian Du Preez 是IT藝術領域的合作伙伴,他在收集JDK中最常見的設計模式方面做得非常出色。 模式列表確實令人印象深刻且很長,所以讓我們不再ba不休,向您展示它。

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

好是好人的敵人!

拜倫

相關文章:


翻譯自: https://www.javacodegeeks.com/2011/03/design-patterns-in-jdk.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/news/374540.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374540.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374540.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

414. 第三大的數

給你一個非空數組,返回此數組中 第三大的數 。如果不存在,則返回數組中最大的數 方法一 首先將數組排序,然后通過集合去除重復的元素,最后進行一次判斷,選擇第三大元素還是最大元素 class Solution {public int thir…

bufferevent 與 socket

http://blog.sina.com.cn/s/blog_56dee71a0100qx4s.html 很多時候,除了響應事件之外,應用還希望做一定的數據緩沖。比如說,寫入數據的時候,通常的運行模式是: l 決定要向連接寫入一些數據,把數據放入到緩沖…

Codeforces Round #102 (Div. 1) A. Help Farmer 暴力分解

A. Help Farmer題目連接: http://www.codeforces.com/contest/142/problem/A Description Once upon a time in the Kingdom of Far Far Away lived Sam the Farmer. Sam had a cow named Dawn and he was deeply attached to her. Sam would spend the whole summe…

電力電子、電機控制系統的建模和仿真_清華團隊研發,首款國產電力電子仿真軟件來啦~已捐贈哈工大、海工大、清華使用!...

點擊上方電氣小青年,關注并星標由于微信改版,只有星標才能及時看到我們的消息哦━━━━━━推薦閱讀:《膜拜大神!清華大學電機系2021年接收推薦免試直碩(博)生擬錄取名單公示!》《滴滴程序員年薪80萬被鄙視不如在二本…

JVM如何處理鎖

當我們談論最新版本的Sun Hotspot Java虛擬機1.6時,當您嘗試從java.util.concurrent.locks.Lock實現獲取鎖或輸入同步塊時,JVM將執行以下三種鎖類型: 有偏見的 :有時即使在并發系統中也沒有爭用,并且在這種情況下&…

基于node.js及express實現中間件,實現post、get

首先,當然是有必要的環境,安裝node,這個我就不多說了。 依賴模塊: "express": "^4.13.4", "request": "^2.72.0", "body-parser": "^1.13.3",頁面 $.ajax({type: &q…

可視化分析之圖表選擇

轉載于:https://www.cnblogs.com/yymn/p/4783631.html

定義并調用函數輸出 fibonacci 序列_科學網—Zmn-0351 薛問天:再談數學概念的定義,評新華先生《0345》...

Zmn-0351 薛問天:再談數學概念的定義,評新華先生《0345》【編者按。下面是薛問天先生發來的文章。是對《Zmn-0345》新華先生文章的評論。現在發布如下,供網友們共享。請大家關注并積極評論。另外本《專欄》重申,這里純屬學術討論&…

Java和內存泄漏

總覽 術語“內存泄漏”在Java中的使用方式不同于在其他語言中使用的方式。 通用術語中的“內存泄漏”是什么意思,在Java中如何使用? 維基百科的定義 當計算機程序消耗內存但無法將其釋放回操作系統時,就會發生計算機科學中的內存泄漏&#x…

453. 最小操作次數使數組元素相等

給你一個長度為 n 的整數數組&#xff0c;每次操作將會使 n - 1 個元素增加 1 。返回讓數組所有元素相等的最小操作次數。 class Solution {public int minMoves(int[] nums) {int res 0;int sum 0;int n nums.length;for(int i 0;i<n;i){sum nums[i];}res sum - min…

第二章 TCP/IP 基礎知識

第二章 TCP/IP 基礎知識 TCP/IP transmission control protocol and ip internet protocol 是互聯網眾多通信協議中最為著名的。 2.2 TCP/IP 的標準化 2.2.2 TCP/IP 標準化精髓 TCP/IP 協議始終具有很強的實用性。 相比于TCP/IP &#xff0c;OSI 之所以未能達到普及&#xff0…

CSS太陽月亮地球三角戀旋轉效果

純粹玩一下&#xff0c;好像沒有什么實際的卵用&#xff0c;but&#xff0c;純玩買不了上當&#xff0c;純玩買不了受騙。。。。。。。。 地月旋轉的一個css效果&#xff0c;無聊玩玩&#xff0c;可以復制到記事本試試 <!DOCTYPE html><html lang"en">&l…

gorm preload 搜索_LeetCode刷題筆記|95:不同的二叉搜索樹 II

題目描述給定一個整數 n&#xff0c;生成所有由 1 ... n 為節點所組成的 二叉搜索樹 。示例輸入&#xff1a;3輸出&#xff1a;[[1,null,3,2],[3,2,null,1],[3,1,null,null,2],[2,1,3],[1,null,2,null,3]]解釋&#xff1a;以上的輸出對應以下 5 種不同結構的二叉搜索樹&#xf…

Java初學者指南

Java編程的第一步。 對于Java中的入門教程&#xff0c;請參閱Sun的官方幫助這里 除了核心語言外&#xff0c;還有幾種技術和API 介紹。 我們建議首先閱讀涵蓋 基礎知識&#xff0c;并繼續其余的教程。 我們建議&#xff1a; 保持代碼簡單易讀 拆分邏輯組件&#xff08;類…

Javascript中Promise對象的實現

http://segmentfault.com/a/1190000000684654 http://www.infoq.com/cn/news/2011/09/js-promise/轉載于:https://www.cnblogs.com/zuiyirenjian/p/4787864.html

字符串分割與存入List集合

List<string> namelist new List<string>(); string[] namejh null; string name "張三李四王五"; 第一步&#xff1a;將三個名字分離出來 namejh name.Split("".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); namelist new Li…

GTJ2018如何導出全部工程量_如何成為優秀的造價員?廣聯達編制內刊手冊,造價員算量高手秘籍...

如何成為優秀的造價員&#xff1f;廣聯達編制內刊手冊&#xff0c;造價員算量高手秘籍[高手秘籍]是廣聯達課程編制委員會暨直播委員會精心打造的&#xff0c;能夠“讓您深入理解軟件計算、設置等原理,遇到問題有處理思路,以常見問題為導向&#xff0c;重點進行原因分析&#xf…

帶有Spring,Hibernate,Akka,Twitter Bootstrap,Apache Tiles和jQuery的Maven Web項目Kickstarter代碼庫...

我很高興將第二個項目上傳到GitHub&#xff0c;以幫助人們盡快開始Java Web App開發。 我正在與Apache License 2.0共享此代碼。 這是相同的網址&#xff1a; https://github.com/ykameshrao/spring-hibernate-springdata-springmvc-maven-project-framework 該項目包括以下部…

git項目添加.gitigore文件

以前一直沒有注意這個文件&#xff0c;最近讀到了黃勇的《架構探險》&#xff0c;覺得這個文件還是很有用的。 .gitigore文件可以自己配置。 我使用的是書中所用的配置&#xff0c;簡潔明了。 # Maven # target/#log# logs/# IDEA # .idea/ *.iml# Eclipse # .settings/ .metad…

463. 島嶼的周長

給定一個 row x col 的二維網格地圖 grid &#xff0c;其中&#xff1a;grid[i][j] 1 表示陸地&#xff0c; grid[i][j] 0 表示水域。 網格中的格子 水平和垂直 方向相連&#xff08;對角線方向不相連&#xff09;。整個網格被水完全包圍&#xff0c;但其中恰好有一個島嶼&a…