《Head First 設計模式》:與設計模式相處

正文

一、設計原則

1、封裝變化

找出應用中可能需要變化之處,把它們獨立出來,不要和那些不需要變化的程式碼混在一起。

2、針對介面編程,不針對實現編程

「針對介面編程」真正的意思是「針對超類型編程」。

超類型可以是抽象類或者介面,關鍵是要利用多態,這樣程式執行時會根據實際狀況執行到真正的行為,不會被綁死在超類型的行為上。

「針對超類型編程」可以更明確地說成:變數的聲明類型應該是超類型,如此,只要是具體實現此超類型的類所產生的對象,都可以指定給這個變數。這也意味著,聲明類時不用理會以後執行時的真正對象類型。

3、多用組合,少用繼承

「有一個」一般比「是一個」更好。換句話說,通過在類中持有其他類來獲得新的行為一般會比通過繼承來獲得新的行為好。

「組合」就是將多個類組合起來使用,即在一個類中持有其他類的引用。

4、為了交互對象之間的松耦合而努力

「松耦合」使對象之間的互相依賴降到了最低。如此一來,當一個對象發生改變時,對其他對象的影響也降到了最低。

5、開閉原則:類應該對擴展開放,對修改關閉

應該讓類在不修改現有程式碼的情況下,就可搭配新的行為。

6、依賴倒置原則:要依賴抽象,不要依賴具體類

不能讓高層組件依賴低層組件,而且,不管高層或低層組件,都應該依賴於抽象。

所謂「高層」組件,是指由其他低層組件定義其行為的類。

避免違反依賴倒置原則的指導方針:

  • 變數不可以持有具體類的引用。
  • 不要讓類派生自具體類。
  • 不要覆蓋基類中已實現的方法。

7、最少知識原則:減少對象之間的交互,只留下幾個「密友」

不要讓太多的類耦合在一起,免得修改系統中的一部分,會影響到其他部分。

為了避免違反最少知識原則,在對象的方法內,我們只應該調用屬於以下範圍的方法:

  • 該對象本身。
  • 被當作方法的參數而傳遞進來的對象。
  • 此方法所創建或實例化的對象。
  • 對象的組件,即被實例變數所引用的對象。

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

在好萊塢原則下,我們允許低層組件將自己掛鉤到系統上,但是高層組件會決定什麼時候和怎樣使用這些低層組件。

換句話說,高層組件對待低層組件的方式是「別調用我們,我們會調用你」。

9、單一責任原則:一個類應該只有一個引起變化的原因

我們知道要避免類內的改變,因為修改程式碼很容易造成許多潛在的錯誤。

如果一個類具有兩個改變的原因,會使得將來該類的變化機率上升,而當它真的改變時,你的設計中同時有兩個方面將會受到影響。

二、定義設計模式

模式是在某情境下,針對某問題的某種解決方案。

  • 情境:應用某個模式的情況。這應該是會不斷出現的情況。
  • 問題:你想在某情境下達到的目標,或者某情景下的約束。
  • 解決方案:你所追求的一個通用的設計,它可以用來解決約束、達到目標。

三、設計模式分類

1、創建型模式

創建型模式涉及到將對象實例化,這類模式都提供一個方法,將客戶從所需要實例化的對象中解耦。

  • 工廠方法模式:由子類決定要創建的具體類是哪一個。
  • 抽象工廠模式:允許客戶創建對象的家族,而無需指定它們的具體類。
  • 單件模式(單例模式):確保有且只有一個對象被創建。
  • 生成器模式(建造者模式):封裝一個複雜對象的創建過程。
  • 原型模式:通過複製現有的實例來創建新的實例。

2、行為型模式

行為型模式涉及到類和對象如何交互及分配職責。

  • 策略模式:封裝可以互換的行為,並使用委託來決定要使用哪一個。
  • 觀察者模式:讓對象能夠在狀態改變時被通知。
  • 命令模式:封裝請求成為對象。
  • 模板方法模式:由子類決定如何實現一個演算法中的步驟。
  • 迭代器模式:在對象的集合之中遊走,而不暴露集合的實現。
  • 狀態模式:封裝了基於狀態的行為,並使用委託在行為之間切換。
  • 責任鏈模式:為某個請求創建一個對象鏈。
  • 解釋器模式:將每一個語法規則表示成一個類。
  • 中介者模式:封裝一系列對象之間的交互。
  • 備忘錄模式:在對象外部存儲對象的某個狀態。
  • 訪問者模式:通過訪問數據結構中的每個元素,來對元素進行各種操作。

3、結構型模式

結構型模式涉及到類和對象如何被組合以建立新的結構或新的功能。

  • 裝飾者模式:包裝一個對象,以提供新的行為。
  • 適配器模式:封裝對象,並提供不同的介面。
  • 外觀模式:簡化一群類的介面。
  • 組合模式:客戶用一致的方式處理對象集合和單個對象。
  • 代理模式:包裝對象,以控制對此對象的訪問。
  • 橋接模式:分離抽象與實現,使它們可以獨立變化。
  • 蠅量模式(享元模式):運用共享技術,減少對象的創建。

相關文章

《Head First 設計模式》:策略模式
《Head First 設計模式》:觀察者模式
《Head First 設計模式》:裝飾者模式
《Head First 設計模式》:工廠方法模式
《Head First 設計模式》:抽象工廠模式
《Head First 設計模式》:單件模式
《Head First 設計模式》:命令模式
《Head First 設計模式》:適配器模式
《Head First 設計模式》:外觀模式
《Head First 設計模式》:模板方法模式
《Head First 設計模式》:迭代器模式
《Head First 設計模式》:組合模式
《Head First 設計模式》:狀態模式
《Head First 設計模式》:代理模式
《Head First 設計模式》:剩下的模式

交流區


微信公眾號:驚卻一目
個人部落格:驚卻一目