HeadFirst設計模式筆記

設計模式(原則)

將設計模式裝進大腦裏,然後在你的設計和已有的應用中,尋找何處可以使用它們。以往是代碼複用,現在是經驗複用。

設計原則1:封裝變化。找出應用中可能需要變化之處,把它們獨立出來,不需要和那些不需要變化的代碼混合在一起。(將會變化的部分取出並“封裝”起來,好讓其他部分不會受到影響。

設計原則2:針對接口編程,而不是針對實現編程。(“針對接口編程”的真正意思是“針對超類型(supertype)編程”,超類型可以是抽象類“或”接口。

設計原則3:多用組合,少用繼承。

設計原則4:爲了交互對象之間的松耦合設計而努力。(松耦合設計能讓我們建立有彈性的OO系統,能夠應對變化,因爲對象之間的互相依賴降到了最低水平。)

設計原則5:類應該對擴展開放,對修改關閉。(我們的目標是允許類容易擴展,在不修改現有代碼的情況下,就可以搭配新的行爲。這樣的設計具有彈性可以應付改變,可以接受新的功能來應對改變的需求)

設計原則6:要依賴抽象,不要依賴具體類。(不讓高層組件依賴低層組件,而且,不管高層或低層組件,“兩者”都應該依賴於抽象)。

設計原則7:最少知識原則:只和你的密友交談。(在設計中,不要讓太多的類耦合在一起,免得修改系統中一部分,會影響到其他部分。)關鍵:不要調用從另一個調用中返回的對象的方法,也就是不要向另一個對象的子部分發請求。

設計原則8:好萊塢原則。(別調用(打電話給)我們,我們會調用(打電話給)你)。

注意:
1. 有一些面向對象的原則,適用於所有的模式。當無法找到合適的模式來解決問題時,採用這些原則可以達到目的。
2. 在設計模式中,“實現一個接口”並“不一定”表示“寫一個類,並利用implement關鍵詞來實現某個java接口”。“實現一個接口”泛指“實現某個超類型(可以是類或接口)的某個方法”。

策略(Strategy)模式

定義: 定義了算法簇,分別將其封裝起來,讓它們之間可以相互替換,該模式讓算法的變化獨立於使用算法的客戶。(當需要給朋友留下深刻的印象,或者想影響關鍵主管的決策時,可以使用“這個”定義。)

  1. 抽象方法的作用:在該類中不用實現它,或者說在該類中不確定該如何實現它,它是用來被重載的方法。(比如有一個鴨子類,它的外觀都不相同,display()方法可以定義爲抽象的)
  2. 當涉及“維護”時,爲了“複用”(reuse)目的而使用繼承,結果並不好。(比如當在父類鴨子中加入fly()方法時,那些不會飛的鴨子(橡皮鴨)也會同時繼承)。
  3. 當使用Flyable接口來實現時(只有會飛的鴨子才能繼承Flyable接口),可以解決上面問題,但是又會導致代碼無法複用的問題。

實例代碼—->headfirst/strategy

菜鳥教程策略模式

觀察者(Observer)模式

注意:當試圖使用觀察者模式時,可以比擬出版者和訂閱者的關係。

定義:定義了對象之間的一對多的依賴關係,這樣一來,當一個對象改變狀態時,它的所有依賴者都會收到通知並自動更新。

觀察者模式有兩種實現方式:
1. 自己實現Subject接口和Observer類。
2. java.util包內有最基本的Obserer(Subject)接口與Observable(Observer)類,(同時提供了推(push)和拉(pull)兩種方式來傳送數據)。push方式被認爲更正確。

注意: 不要依賴觀察者被通知的次序。(java自帶的觀察者模式,Observable是一個類,它會自己實現notifyObservers()方法,該方法會自定義其觀察者的順序)

應用:在JavaBeans和Swing中也使用了觀察者模式。
實例代碼—->headfirst/observer
菜鳥教程觀察者模式

裝飾者(Decorator)模式

定義:動態地將責任附加到對象上。若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案。

注意: 通常裝飾者模式採用抽象類,但是在java中可以使用接口。
應用: 在java I/O中使用了裝飾者設計模式。

實例代碼—->headfirst/decorator
菜鳥教程裝飾者模式

工廠(Factory)模式

應用:
1. Collection中的iterator方法
2. JDBC數據庫開發

1.簡單工廠

注意:簡單工廠不是一個設計模式,它更像是一種編程習慣。

靜態工廠: 利用靜態方法定義一個簡單工廠。

優點:不需要使用創建對象的方法來實例化對象。
缺點:不能通過繼承來改變創建方法的行爲。(因爲靜態方法只和類相關,不能通過繼承來重寫該方法)。
實例代碼—->headfirst/factory/pizzas
菜鳥教程工廠模式

2.工廠方法

定義:定義一個創建對象的接口,但是由子類決定要實例化的類是哪一個。工廠方法讓類把實例化推遲到子類。(所謂的“決定”,並不是指模式允許子類本身在運行時做出決定,而是指在編寫創建者類時,不需要知道實際創建的產品是哪一個。)
實例代碼—->headfirst/factory/pizzafm
菜鳥教程工廠模式

3.抽象工廠

定義:提供一個接口,用於創建相關或依賴對象的家族,而不需要明確的指定具體類。

實例代碼—->headfirst/factory/pizzaaf
菜鳥教程抽象工廠模式

要點:
1. 所有的工廠都是用來封裝對象的創建。
2. 簡單工廠,雖然不是真正的設計模式,但依然是一個簡單的方法,將客戶程序從具體類中解耦。
3. 工廠方法使用繼承:把對象的創建委託給子類,子類實現工廠方法來創建對象。
4. 抽象工廠使用對象組合:對象的創建被實現在工廠接口所暴露出來的方法中。
5. 所有工廠模式都通過減少應用程序和具體類之間的依賴促進松耦合。
6. 工廠方法允許類將實例化延遲到子類中進行。
7. 抽象工廠創建相關的對象家族,而不需要依賴它們的具體類。
8. 依賴倒置原則,指導我們避免依賴具體類型,而要儘量依賴抽象。
9. 工廠是很有威力的技巧,幫助我們針對抽象編程,而不要針對具體類編程。

單件模式

定義:確保一個類只有一個實例,並提供一個全局訪問點。(注意處理多線程的情況)

餓漢式: 類一加載就創建對象
懶漢式: 用的時候纔去創建對象

應用:Runtime類中提供了餓漢式單例模式,jdk都是用餓漢式,我們開發時就要使用餓漢式(單面試的時候面試官叫你寫一個單例模式那你要寫懶漢式,因爲他要考你的是線多程安全問題)
實例代碼—->headfirst/singleton
菜鳥教程單例模式

適配器模式

定義:將一個類的接口,轉換成客戶期望的另一各接口。適配器讓原本接口不兼容的類可以合作無間。

使用場景:當需要使用一個現有的類而其接口並不符合你的需要時,就使用適配器。

注意:適配器模式有兩種形式,對象適配器和類適配器。而類適配器需要用到多重繼承。

應用:將Enumeration(舊世界的枚舉類)適配到Iterator(新世界的迭代器)。
實例代碼—->headfirst/adapter
菜鳥教程適配器模式

外觀模式

定義:提供了一個統一的接口,用來訪問子系統中的一羣接口。外觀定義了一個高層接口,讓子系統更容易使用。

使用場景:當需要簡化並統一一個很大的接口或者一羣複雜的接口時,使用外觀。

實例代碼—->headfirst/facade
菜鳥教程外觀模式

對比:
1. 適配器將一個對象包裝起來以改變其接口;
2. 裝飾者將一個對象包裝起來以增加新的行爲和責任;
3. 外觀將一羣對象包裝起來以簡化其接口。

模板方法模式

定義:在一個方法中定義一個算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變算法結構的情況下,重新定義算法中的某些步驟。

注意:
1. 爲防止惡意操作,一般模板方法都加上 final 關鍵詞。
2. 策略模式和模板方法模式都封裝算法,一個用組合,一個用繼承。
3. 工廠方法是模板方法的一種特殊版本。

鉤子:鉤子是一種被聲明在抽象類中的方法,但只有空的或者默認的實現。

使用場景:
1. Arrays.sort()排序算法(利用Comparable接口)
2. Swing窗口程序
3. Applet

實例代碼—->headfirst/templatemethod
菜鳥教程模板方法模式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章