JDK中涉及的設計模式總結
阿新 • • 發佈:2019-02-13
所有的設計模式都找了一種JDK中的實現(並未列出所有,原因是太多,而且本次整理的目的是通過JDK中的例項完成設計模式的梳理和記憶,所以只寫一種實現)。依次對類,對應的方法,功能進行介紹。
建立模式
1.抽象工廠
- javax.xml.parsers.DocumentBuilderFactory抽象類
- public static DocumentBuilderFactory newInstance()方法
- 類功能:使得應用程式可以通過XML檔案,獲得一個能生成DOM物件的解析器。
- 方法功能:獲取一個DocumentBuilderFactory的新例項。這一靜態方法會建立一個新的工廠例項
2.建造者模式
- java.lang.StringBuilder,這是一個final類
- public StringBuilder append(String str)方法,這一方法是對父類的覆寫。
- 類功能:用於一個不可更改的字元序列。
- 方法功能:根據現有字元序列和追加字元,通過系統拷貝方法System.arraycopy生成一個新的字元序列。
3. 工廠模式
- java.text.NumberFormat抽象類
- public final static NumberFormat getInstance()方法
- 類功能:用於數字格式的抽象基類。
- 方法功能:返回一個“對當前預設場景下的一個通用數字格式”的NumberFormat。顯然屬於工廠模式的使用。
4.原型模式
- java.lang.Object
- protected native Object clone() 方法
- 類功能:所有類的父類
- 方法功能:根據現有例項,返回一個淺拷貝物件。
5.單例模式
- java.lang.RunTime類
- public static Runtime getRuntime()
- 類功能:每一個執行的java應用都會有一個唯一的RunTime類的例項,這個例項使得應用程式在執行期間能夠受到執行環境的影響。
- 方法功能:返回一個和當前java應用關聯的RunTime物件。
實現方式:
private static Runtime currentRuntime = new Runtime(); public static Runtime getRuntime() { return currentRuntime; }
結構模式
6.介面卡模式
- java.util.Arrays
- public static List asList(T… a)方法
- 類功能:此類包含了大量對陣列操作的方法。
- 方法功能:將一個引用型別的陣列轉為一個List。從而可以使用List類的操作來運算元組物件,但是有一點要注意:就是不能使用add(),remove()操作,因為返回的list底層是基於陣列的,陣列結構是不能更改的。 list類就是這裡的介面卡,通過這個介面卡,對陣列的直接操作變為間接操作。
7.橋接模式
目前沒有找到
8.組合模式
- java.awt.Container類
- public Component add(Component comp)方法
- 類功能:一個通用的AWT(Abstract Window Toolkit)容器,能夠用於儲存其它AWT元件。
- 方法功能:新增一個AWT元件到容器中。
9.裝飾器模式
- Reader抽象類和Writer抽象類有相同的構造器函式。
- 構造器函式
- 類功能:Reader抽象類用於讀一個字符集流;Writer抽象類用於寫一個字符集流。
- 方法功能:就是建構函式的功能
10.門面模式
- javax.faces.context.ExternalContext,內部使用了ServletContext, HttpSession, HttpServletRequest, HttpServletResponse等等。
11.享元模式
- java.lang.Integer(其它基本型別包裝類(除去Float,Double)也如此,還有BigDecimal)
- Integer.valueOf()方法
- byte,short,int,long,boolean,char的包裝型在類載入到JVM時,已經快取了制定範圍的物件引用,因為值的設定使用的是static塊或者常量。其中char的範圍為:0~127;boolean的值為true和false;其它預設範圍都是-127~128。其中int的上限127可以調整,這需要調整JVM的引數。
- 同時利用了享元模式的還有String這個類,因為生存的每個字串都是不可變的。
12.代理模式
- java.lang.reflect.Proxy類
- 原理:代理提供了一個static方法用於建立一個動態代理類和被代理類的例項。它是所有通過此方式建立動態代理類的父類。
使用方式:
InvocationHandler handler = new MyInvocationHandler(...); class proxyClass = Proxy.getProxyClass(Foo.class.getClassLoader(), Foo.class); Foo f = (Foo) proxyClass.getConstructor(InvocationHandler.class).newInstance(handler); 也可以更簡單的寫為: Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),new Class[]{Foo.class},handler);
行為模式
13.職責鏈模式
- java.util.logging.Logger類
- public void log(LogRecord record)
- 類功能:為系統or元件記錄日誌訊息。如何體現了職責鏈模式:每個記錄器都跟蹤“父”記錄器,所謂”父”記錄器,就是Logger名稱空間中最近的現有祖先。
- 方法功能:用於記錄日誌資訊。這一類中所有其它的日誌方法都是通過呼叫這一方法實現日誌記錄的。子類能夠覆寫這一方法從而獲取所有的日誌行為。
14.命令模式
- java.lang.Runnable
- 所有對Runable介面的實現類
- 類功能:實現Runable介面的類,可以被執行緒執行。
- 如果體現了命令模式:通過實現Runable介面的類,將請求封裝為一個物件,對請求排隊或記錄請求日誌,以及支援可撤銷操作。允許接受請求的一方決定是否要否決請求,最重要一點就是:命令模式把請求一個操作的物件和怎麼執行一個操作的物件解耦。這就是Excutor框架執行實現Runable介面任務類的體現。
15.直譯器模式
- java.text.Format
- 類功能:此抽象類用於格式化一些格式敏感的資訊,如:日期,資訊,數字等。
- 實現方式:此類定義了一些方法,用於:將格式敏感的資訊轉為String。
16.迭代器模式
這個就不說了,很多集合已經使用了迭代器進行遍歷。
17.中介者模式
- java.util.concurrent.Executor介面
- 定位:行為方法類通常定義為抽象/介面型別(抽象/介面型別通常使用命令模式),此類代理/使用了這一行為例項。
- 如何體現 :Executor框架將工作單元和執行機制解耦和。java多執行緒程式通常把應用分解為多個任務,然後Executor框架將這些任務對映為固定數量的執行緒;在底層,作業系統核心將這些執行緒對映到硬體CPU上。
18.備忘錄模式
- java.io.Serializable介面
- 介面功能:只有實現了Serializable介面的類才能序列化,此介面中沒有任何方法,只是為類標記實現了此介面的類可以進行序列化。而如果一個類想要序列化,除了實現這個介面外,還要自己寫ReadObject(),WriteObject()方法,用於對流的讀取和輸出。
19.觀察者模式(釋出/訂閱模式)
- java.util.EventListener介面
- 類功能:所有事件監聽介面,都必須擴充套件此介面。
20.狀態模式
- javax.faces.webapp.FacesServlet
- 例項方法的執行依賴於例項狀態。
21.策略模式
- java.util.Comparator函式介面
- compare()方法
- 比較器的使用就是:先寫一個比較器,然後對Arrays或者Collections排序的時候,將寫好的比較器作為引數傳入排序的方法,就能實現按照比較器的規則,對Arrays或者Collections進行排序。
- 比較器方法如何體現策略模式的:策略模式是指:一個類/介面A的行為方法的執行,是通過呼叫另一個不同的類/介面B而實現的。呼叫方式是將B作為A的傳入引數。這和Comparator的原理完全一致。
22.模版方法模式
- java.util.AbstractList
- 所有的非抽象方法
- 如何體現模版方法模式:模版方法模式定義,就是說:在一個抽象類中行為方法總是有一個預設行為,子類可以直接使用,也可以覆寫。ArrayList繼承了AbstractList,沒有覆寫的方法在使用時,直接使用Abstract中的方法。
23.訪問者模式
- java.nio.file.FileVisitor介面
- 類功能:一個用於訪問檔案的介面。這一介面的實現類通過Files.walkFileTree方法實現對檔案樹中每一個檔案的訪問。
- public static Path walkFileTree(Path start,Set options,
int maxDepth,FileVisitor< super Path> visitor) ,這一方法中回調了visitor的方法。