《HeadFirst設(shè)計(jì)模式》讀書筆記
1.策略模式: 定義了算法族,分別封裝起來,讓他們之間可以互相替換,此模式讓算法的變化使用獨(dú)立于算法的客戶。
????設(shè)計(jì)原則1:找出應(yīng)用中可能需要變化之處,把它們獨(dú)立出來,不要和不需要變化的代碼混在一起。
????設(shè)計(jì)原則2:針對接口編程,而不是針對實(shí)現(xiàn)編程(這里“接口”是一種概念,不單指java的Interface,指超類型)
????設(shè)計(jì)原則3:多用組合,少用繼承

2.觀察者模式:定義了對象間的一對多依賴,當(dāng)一個對象改變狀態(tài)時,它的所有依賴者都會得到通知并更新
?出版者? ? ? ? ? ? +? ? ? ? ? 訂閱者? ? ? ? ? ? ? ? ? =? ?觀察者模式
(主題Observable)? ? ? ? ? ? ? (觀察者Observer)
設(shè)計(jì)原則4:為對象間的松耦合設(shè)計(jì)而努力

Java里面有與之對應(yīng)的java.util包的Observable類(對應(yīng)Subject接口),和Observer接口,如下圖。

3.裝飾者模式:動態(tài)地將責(zé)任附加到對象上。若要擴(kuò)展功能,裝飾者提供了比繼承更有彈性的替代方案。
設(shè)計(jì)原則5:類應(yīng)該對擴(kuò)展開放,對修改關(guān)閉(開放-閉合原則)

可以用一個裝飾者包裝一個對象(被裝飾者),裝飾者和被裝飾者擁有相同的超類型,所以可以用裝飾過的對象代替它,裝飾者可以在所委托的被裝飾者的行為之前或之后,加上自己的行為已達(dá)到特定的目的。
(每個裝飾者有一個(包裝一個)組件,就是有個實(shí)例變量來保存component的引用(我想到的是類似鏈表))

Java.io 應(yīng)用到了裝飾者模式

4.工廠模式:定義了一個創(chuàng)建對象的接口,但由子類決定實(shí)例化的類是哪一個,工廠方法讓類把實(shí)例化推遲到子類

創(chuàng)建一個抽象類,創(chuàng)建實(shí)例的方法聲明為抽象方法。

設(shè)計(jì)原則6:要依賴抽象,不要依賴具體類(依賴倒置原則)
不能讓高層組件依賴底層組件。無論是高層底層,都應(yīng)該依賴抽象。
抽象工廠模式:提供一個接口,用于創(chuàng)建相關(guān)或依賴的家族,而不需要明確指定具體類。
抽象工廠和工廠模式的區(qū)別:抽象工廠使用對象組合(接口),工廠模式使用繼承,一個抽象工廠會包含多個工廠方法。
5.單例模式:確保一個類只有一個實(shí)例,并提供一個全局訪問點(diǎn)。
應(yīng)用到單例模式的地方包括:線程池、緩存、對話框、注冊表、日志、打印機(jī)、顯卡等設(shè)備的驅(qū)動。
單例模式實(shí)現(xiàn)的方法是將單例類的構(gòu)造器私有化,保證只有在此類中才能創(chuàng)建實(shí)例,再創(chuàng)建一個靜態(tài)的創(chuàng)建實(shí)例的方法。
例如:? ?public class Singleton{
? ? ? ? ? ? ? ? ? ? private static Singleton? uniqueInstance; // 利用一個靜態(tài)變量作為singleton的唯一實(shí)例
????????????????????private? Singleton(){};? ? ? ? ? ? ? //構(gòu)造器會在new Xxx() 得到返回值之前執(zhí)行,構(gòu)造器私有,保證只有? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 有Singleton類才可以調(diào)用
? ? ? ? ? ? ? ? ? ? public static Singleton getInstance(){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(?uniqueInstance == null)
? ???????????????????????????????????????uniqueInstance =? new Singleton();
????????????????????????????????return? uniqueInstance;
? ? ? ? ? ? ? ? ? ?}
? ? ? ? }
6.命令模式:將“請求”封裝成對象,以便于使用不同的請求、隊(duì)列或者日志來參數(shù)化其他對象。命令模式也支持可撤銷操作。

需要將發(fā)出請求的對象和執(zhí)行請求的對象解耦的時候,使用命令模式。
1. 命令模式將發(fā)出請求的對象和執(zhí)行請求的對象解耦。
2. 在被解耦的兩者間是用命令對象溝通的,命令對象封裝了執(zhí)行對象和一個或者一組動作(請求)。
(命令模式還可以實(shí)現(xiàn) 撤銷功能、將一組命令一起執(zhí)行的宏命令功能、隊(duì)列請求、日志請求等功能)
7.適配器模式:將一個類的接口,轉(zhuǎn)換成客戶期望的另一個接口。適配器讓原本接口不相容的類合作無間。

適配器改變接口,以符合客戶的需求。
對象適配器使用組合,類適配器需要使用多繼承(Java做不到)
8.外觀模式:提供了一個統(tǒng)一的接口,用來訪問子系統(tǒng)中的一群接口。外觀定義了一個高層接口,讓子系統(tǒng)更容易使用。
設(shè)計(jì)原則7(最少知識原則):類盡可能少地和其他類發(fā)生交互(減少對象之間的交互,只留下幾個密友)。
最少知識原則和德墨忒爾法則指的是同一個,最少知識原則更名字更貼切。

外觀模式可以把子系統(tǒng)里面的多個方法集中到一個外觀類的方法里。例如有一個家庭影院系統(tǒng),點(diǎn)擊觀影模式會自動完成播放影片,降低亮度,開啟音效和爆米花機(jī)等多個功能。
外觀模式將客戶從一個復(fù)雜的子系統(tǒng)中解耦。
外觀和適配器可以包裝許多類,但是外觀的意圖是簡化接口,而適配器的意圖是將接口轉(zhuǎn)化成不同接口。
9.模板方法模式:在一個方法中定義一個算法的骨架,而將一些步驟延遲到子類中。模板方法可以使子類在不改變算法結(jié)構(gòu)的情況下,重新定義算法的某些驟。

設(shè)計(jì)原則8(好萊塢原則):別調(diào)用(打電話給)我們,我們會調(diào)用(打電話給)你們。
好萊塢原則告訴我們,將決策權(quán)放在高層模塊中,以便決定如何以及何時調(diào)用底層模塊。
模板方法的抽象類可以定義具體方法、抽象方法和鉤子。
鉤子是一種方法,它在抽象類中不做任何事,或者做默認(rèn)的事,子類可以選擇要不要覆蓋它。
為了防止子類修改模板方法中的算法,可以把模板中的算法聲明為final。
策略模式和模板方法模式都封裝算法,一個用組合,一個用繼承。
工廠方法是模板方法中的一個特殊版本。
10.迭代器模式:提供一個方法順序訪問一個聚合內(nèi)的各個元素,而又不暴露其內(nèi)部的具體表示。
把游走的任務(wù)放在迭代器上,而不是集合上。這樣簡化了集合的接口和實(shí)現(xiàn),也讓集合各得其所。
設(shè)計(jì)原則9:一個類應(yīng)該只有一個引起變化的原因。

11.組合模式:允許你將對象組合成樹形結(jié)構(gòu)來表現(xiàn)“整體/部分”層次結(jié)構(gòu)。組合能讓客戶以一致的方式處理個別對象以及對象組合。
組合模式讓我們能用樹形方式創(chuàng)建對象的結(jié)構(gòu),樹里面包含了組合以及個別對象
使用組合結(jié)構(gòu),我們能把相同的操作應(yīng)用在組合和個別對象上。換句話說,在大多數(shù)情況下, 我們可以忽略對象組合和個別對象之間的差別。

組合結(jié)構(gòu)內(nèi)的任意對象稱為組件,組件可以是組合,也可以是葉結(jié)點(diǎn)。
在實(shí)現(xiàn)組合模式時,有許多技術(shù)上的折衷。你要根據(jù)需要平衡透明性和安全性。