《HeadFirst設(shè)計模式》讀書筆記
1.策略模式: 定義了算法族霹俺,分別封裝起來汞舱,讓他們之間可以互相替換,此模式讓算法的變化使用獨立于算法的客戶遵堵。
????設(shè)計原則1:找出應(yīng)用中可能需要變化之處,把它們獨立出來龄恋,不要和不需要變化的代碼混在一起。
????設(shè)計原則2:針對接口編程,而不是針對實現(xiàn)編程(這里“接口”是一種概念患雏,不單指java的Interface,指超類型)
????設(shè)計原則3:多用組合罢维,少用繼承
2.觀察者模式:定義了對象間的一對多依賴淹仑,當(dāng)一個對象改變狀態(tài)時,它的所有依賴者都會得到通知并更新
?出版者? ? ? ? ? ? +? ? ? ? ? 訂閱者? ? ? ? ? ? ? ? ? =? ?觀察者模式
(主題Observable)? ? ? ? ? ? ? (觀察者Observer)
設(shè)計原則4:為對象間的松耦合設(shè)計而努力
Java里面有與之對應(yīng)的java.util包的Observable類(對應(yīng)Subject接口)肺孵,和Observer接口匀借,如下圖。
3.裝飾者模式:動態(tài)地將責(zé)任附加到對象上平窘。若要擴(kuò)展功能吓肋,裝飾者提供了比繼承更有彈性的替代方案。
設(shè)計原則5:類應(yīng)該對擴(kuò)展開放瑰艘,對修改關(guān)閉(開放-閉合原則)
可以用一個裝飾者包裝一個對象(被裝飾者)蓬坡,裝飾者和被裝飾者擁有相同的超類型,所以可以用裝飾過的對象代替它磅叛,裝飾者可以在所委托的被裝飾者的行為之前或之后屑咳,加上自己的行為已達(dá)到特定的目的。
(每個裝飾者有一個(包裝一個)組件弊琴,就是有個實例變量來保存component的引用(我想到的是類似鏈表))
Java.io 應(yīng)用到了裝飾者模式
4.工廠模式:定義了一個創(chuàng)建對象的接口兆龙,但由子類決定實例化的類是哪一個,工廠方法讓類把實例化推遲到子類
創(chuàng)建一個抽象類敲董,創(chuàng)建實例的方法聲明為抽象方法紫皇。
設(shè)計原則6:要依賴抽象,不要依賴具體類(依賴倒置原則)
不能讓高層組件依賴底層組件腋寨。無論是高層底層聪铺,都應(yīng)該依賴抽象。
抽象工廠模式:提供一個接口萄窜,用于創(chuàng)建相關(guān)或依賴的家族铃剔,而不需要明確指定具體類。
抽象工廠和工廠模式的區(qū)別:抽象工廠使用對象組合(接口)查刻,工廠模式使用繼承键兜,一個抽象工廠會包含多個工廠方法。
5.單例模式:確保一個類只有一個實例穗泵,并提供一個全局訪問點普气。
應(yīng)用到單例模式的地方包括:線程池、緩存佃延、對話框现诀、注冊表夷磕、日志、打印機仔沿、顯卡等設(shè)備的驅(qū)動坐桩。
單例模式實現(xiàn)的方法是將單例類的構(gòu)造器私有化,保證只有在此類中才能創(chuàng)建實例于未,再創(chuàng)建一個靜態(tài)的創(chuàng)建實例的方法撕攒。
例如:? ?public class Singleton{
? ? ? ? ? ? ? ? ? ? private static Singleton? uniqueInstance; // 利用一個靜態(tài)變量作為singleton的唯一實例
????????????????????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.命令模式:將“請求”封裝成對象抖坪,以便于使用不同的請求、隊列或者日志來參數(shù)化其他對象闷叉。命令模式也支持可撤銷操作擦俐。
需要將發(fā)出請求的對象和執(zhí)行請求的對象解耦的時候,使用命令模式握侧。
1. 命令模式將發(fā)出請求的對象和執(zhí)行請求的對象解耦蚯瞧。
2. 在被解耦的兩者間是用命令對象溝通的,命令對象封裝了執(zhí)行對象和一個或者一組動作(請求)品擎。
(命令模式還可以實現(xiàn) 撤銷功能埋合、將一組命令一起執(zhí)行的宏命令功能、隊列請求萄传、日志請求等功能)
7.適配器模式:將一個類的接口甚颂,轉(zhuǎn)換成客戶期望的另一個接口。適配器讓原本接口不相容的類合作無間秀菱。
適配器改變接口振诬,以符合客戶的需求。
對象適配器使用組合衍菱,類適配器需要使用多繼承(Java做不到)
8.外觀模式:提供了一個統(tǒng)一的接口赶么,用來訪問子系統(tǒng)中的一群接口。外觀定義了一個高層接口脊串,讓子系統(tǒng)更容易使用辫呻。
設(shè)計原則7(最少知識原則):類盡可能少地和其他類發(fā)生交互(減少對象之間的交互,只留下幾個密友)洪规。
最少知識原則和德墨忒爾法則指的是同一個印屁,最少知識原則更名字更貼切。
外觀模式可以把子系統(tǒng)里面的多個方法集中到一個外觀類的方法里斩例。例如有一個家庭影院系統(tǒng),點擊觀影模式會自動完成播放影片从橘,降低亮度念赶,開啟音效和爆米花機等多個功能础钠。
外觀模式將客戶從一個復(fù)雜的子系統(tǒng)中解耦。
外觀和適配器可以包裝許多類叉谜,但是外觀的意圖是簡化接口旗吁,而適配器的意圖是將接口轉(zhuǎn)化成不同接口。
9.模板方法模式:在一個方法中定義一個算法的骨架停局,而將一些步驟延遲到子類中很钓。模板方法可以使子類在不改變算法結(jié)構(gòu)的情況下,重新定義算法的某些驟董栽。
設(shè)計原則8(好萊塢原則):別調(diào)用(打電話給)我們码倦,我們會調(diào)用(打電話給)你們。
好萊塢原則告訴我們锭碳,將決策權(quán)放在高層模塊中袁稽,以便決定如何以及何時調(diào)用底層模塊。
模板方法的抽象類可以定義具體方法擒抛、抽象方法和鉤子推汽。
鉤子是一種方法,它在抽象類中不做任何事歧沪,或者做默認(rèn)的事歹撒,子類可以選擇要不要覆蓋它。
為了防止子類修改模板方法中的算法诊胞,可以把模板中的算法聲明為final暖夭。
策略模式和模板方法模式都封裝算法,一個用組合厢钧,一個用繼承鳞尔。
工廠方法是模板方法中的一個特殊版本。
10.迭代器模式:提供一個方法順序訪問一個聚合內(nèi)的各個元素早直,而又不暴露其內(nèi)部的具體表示寥假。
把游走的任務(wù)放在迭代器上,而不是集合上霞扬。這樣簡化了集合的接口和實現(xiàn)糕韧,也讓集合各得其所。
設(shè)計原則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é)點扫腺。
在實現(xiàn)組合模式時,有許多技術(shù)上的折衷村象。你要根據(jù)需要平衡透明性和安全性笆环。