Java23種設計模式學習筆記【目錄總貼】

Roninwz發表於2017-10-14

建立型模式關注物件的建立過程

  1、單例​模式:保證一個類只有一個例項,並且提供一個訪問該例項的全域性訪問點

主要:

餓漢式(執行緒安全,呼叫效率高,但是不能延時載入)

懶漢式(執行緒安全,呼叫效率不高,但是可以延時載入)

其他:

雙重檢測鎖式(由於JVM底層內部模型原因,偶爾會出問題。不建議使用)

靜態內部類式(執行緒安全,呼叫效率高。但是可以延時載入)

列舉單例(執行緒安全,呼叫效率高,不能延時載入)

2、工廠模式

 簡單工廠模式:用來生產同一等級結構中的任意產品(對已有產品新增功能,需要修改原始碼)

 雖然能通過工廠來建立物件,但是違反了開閉原則。一旦增加功能需要在原有基礎上修改程式碼。

 工廠方法模式:用來生產同一等級結構中的固定產品(支援增加任意產品,不用修改原始碼)

                             將工廠類調整為工廠介面,需要什麼型別的工廠就使用該類實現該工廠,建立相應的產品。

 抽象工廠模式:

3、抽象工廠模式:用來生產不同產品族的全部產品(對於增加新的產品,無能為力。可增加一系列的產品族)

 抽象工廠模式用來生產不同產品族的全部產品,對於只增加產品某一部分則不適用。抽象工廠模式是工廠模式的一種升級版本。

4、建造者​模式分離了物件子元件的單獨構造(由Builder來負責構建,由Director來負責組裝),從而可以構造出複雜的物件。

   假如一個物件的構建很複雜,需要很多步驟。如果使用了建造者模式,會將其構建物件,和組裝成一個物件這兩步給分開來

   構建部分為(builder)和組織部分(director),實現了構建和裝配的解耦。

5、原型模式通過new產生一個物件需要非常繁瑣的資料準備或訪問許可權,則可以使用原型模式。

   所謂原型模式就是構建一個物件的原型,通過原型來建立出新的物件。

 

行為型模式關注系統中物件之間的相互互動,研究系統在執行時物件之間的相互通訊和協作,進一步明確物件的職責。

6、模板方法模式定義一個操作中的演算法骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的

某些特定步驟。也就是說:假如某些操作程式碼基本相同,只是其中一部分會經常改變,則可以使用模板方法,將不變的部分作為一個模板,將容易變動的

部分讓子類來實現。

7、命令模式(不常用)將一個請求封裝為一個物件,從而使你可用不同的請求對客戶進行引數化,對請求排隊或記錄請求日誌。以及支援可撤銷的操作。說白了,就是將一系列的請求命令封裝起來,不直接呼叫真正執行者的方法,這樣比較好擴充套件。

8、迭代器模式提供一種方法順序的訪問一個聚合物件中各個元素,而又不暴露該物件的內部表示。也就是開發一個用於迭代某個物件中元素的功能。

一般我們開發時很少自己開發,因為jdk內建了迭代器。

9、觀察者模式也叫(釋出-訂閱模式)定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某一個主題物件,這個主題物件在狀態發生變化時,會通知所有觀察者物件。使它們能夠自動更新自己。例如:發廣播,遊戲中大喇叭,群聊

jdk中提供了抽象主題和抽象觀察者的介面,我們可以使用這兩個介面來方便的定義自己的觀察者模式

10、中介者模式用一箇中介物件來封裝一系列的物件互動,中介者使各物件不需要顯示地相互引用。從而使其耦合鬆散,而且可以獨立地改變它們之間的互動。中介者模式核心:1.就是將網狀結構處理成星型結構      2.將多對多處理成一對多

11、備忘錄模式在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態。

也就是說,不破壞源資料的情況下,將源資料進行一次或者多次的備份。

12、直譯器模式(不常用)給定一個語言,定義它的文法一種表示。並定義一個直譯器,這個直譯器使用該表示來解釋語言中的句子。

13、狀態模式當一個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類

狀態模式主要解決的是當控制一個物件狀態轉換的條件表示式過於複雜時的情況。當遇到不同的狀態遇到不同的行為的時候,可以使用狀態模式

例如:酒店房間的狀態,是空閒,預定,還是已入住呢?而且這三種狀態都對應著不同的行為,空閒的話就可預定,可預定的話就可入住,已入住的話

就不能顯示空閒。

14、策略模式它定義了演算法家族,分別封裝起來,讓它們之間可以互相替換,此模式讓演算法的變化不會影響到使用演算法的客戶。

例如:商場中的打折商品,針對不同的客戶可能有不同的折扣。那這些演算法該怎麼定義呢?可以使用策略模式,給每個會員或者商品都指定一個特定的演算法,根據不同的演算法,打不同的折扣。

15、職責鏈模式將能夠處理同一類請求的物件連成一條鏈,使這些物件都有機會處理請求,所提交的請求沿著鏈傳遞。從而避免請求的

傳送者和接受者之間的耦合關係。鏈上的物件逐個判斷是否有能力處理該請求,如果能則就處理,如果不能,則傳給鏈上的下一個物件。

直到有一個物件處理它為止。比如:請假申請,審批人連成一條鏈,每個人都有機會處理這個假條,但是這個請假申請最終肯定會經過稽核(不管審批是否通過)。

16、訪問者模式(不常用)表示一個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。

 

結構型模式關注物件和類的組織

17、介面卡模式將一個類的介面轉換成客戶希望的另外一個介面。Adapter模式使得原本由於介面不相容而不能一起工作的類可以一起工作。

例如:NBA中的球員來自不同國家,而世界標準語言是英語。那他們不會英語,也不能各自學習所有國家的語言。所以,最好的辦法就是請不同的翻譯

將這些球員國家的語言翻譯成英語。而這些翻譯就是介面卡!!

 介面卡模式分類:

1、類介面卡模式(不推薦使用):由於類介面卡模式需要多重繼承對一個介面對另一個介面進行適配,而C#,Java不支援多重繼承。

2、物件介面卡模式:採用組合的方式

18、橋接模式將抽象部分與它的實現部分分離,使它們都可以獨立的變化。而不會直接影響到其他部分。橋接模式解決了多層繼承的結構,處理多維度變化的場景,將各個維度設計成獨立的繼承結構。使各個維度可以獨立的擴充套件在抽象層建立聯絡。

19、裝飾模式也叫裝飾者模式或者裝飾器模式,表示動態的給一個物件新增一些新的功能(利用子類繼承父類也可以實現),但是比生成子類方式更靈活。例如:我們每個人身上穿的衣服,鞋子,領帶,披風都可以理解為是對人的裝飾

20、組合模式將物件組合成樹形結構以表示:部分--整體 的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。基本上見到的樹形結構都使用到了組合模式。

21、外觀模式為子系統中的一組介面提供一個一致的介面,此模式定義了一個高層介面。這個介面使得這一子系統更加容易使用。遵守迪米特法則(最少知識原則)。說白了,就可以理解為封裝。外觀模式的核心:為子系統提供統一的入口,封裝子系統的複雜性,便於客戶端呼叫

22、享元模式運用共享技術有效的支援大量細粒度物件的重用。它能做到共享的關鍵就是區分了內部狀態(可以共享,不會隨環境變化而變化外部狀態(不可以共享,會隨環境變化而變化如果專案中有很多完全相同或相似的物件,則可以使用享元模式,節省記憶體。

23、代理模式為其他物件提供一種代理以便控制對這個物件的訪問。

可以詳細控制訪問某個類(物件)的方法,在呼叫這個方法前作的前置處理(統一的流程程式碼放到代理中處理)。呼叫這個方法後做後置處理。

例如:明星的經紀人,租房的中介等等都是代理

 代理模式分類:

1.靜態代理(靜態定義代理類,我們自己靜態定義的代理類。比如我們自己定義一個明星的經紀人類)

2.動態代理(通過程式動態生成代理類,該代理類不是我們自己定義的。而是由程式自動生成)比較重要!!

 

參考資料:

大話設計模式(帶目錄完整版).pdf

HEAD_FIRST設計模式(中文版).pdf

尚學堂_高淇_java300集最全視訊教程_【GOF23設計模式】


轉載來自:http://www.cnblogs.com/meet/p/5116437.html

相關文章