設計模式筆記2:面向對象設計原則

1. 依賴倒置原則(DIP)

  • 高層模塊(穩定)不應該依賴於低層模塊(變化),二者都應該依賴於抽象(穩定)

  • 抽象(穩定)不應該依賴於實現細節(變化) ,實現細節應該依賴於抽象(穩定)

    目的:隔離變化,模塊分開

2. 開閉原則(OCP)

  • 對擴展開放,對更改封閉

  • 類模塊應該是可擴展的,但是不可修改

    思路:需要更改,應該是去擴展,而不是滿世界的去找地方改(類比上一節課,每增加一個形狀只需要重新繼承Shape,重載抽象方法;而不用像分解的方法一樣,改動到原先MainForm類的內部邏輯)

3. 單一職責原則(SRP)

  • 一個類應該僅有一個引起它變化的原因

  • 變化的方向隱含着類的責任。

    思路:一個類不應該有過多的功能(職責);如果一個類有多於一個的動機被改變,那麼這個類就具有多於一個的職責

4. Liskov 替換原則(LSP)

  • 子類必須能夠替換它們的基類(IS-A)

  • 繼承表達類型抽象

    思路:當寫子類時發現父類的方法無法適用於子類使用時 ,也許該子類並不應該繼承於此父類

5. 接口隔離原則(ISP)

  • 不應該強迫客戶程序依賴它們不用的方法

  • 接口應該小而完備

    思路: 不要把不必要的方法暴露出去,如果只是子類使用的話設置爲protect,如果只是本類使用則設置爲private

6. 優先使用對象組合,而不是類繼承

  • 類繼承通常爲“白箱複用”,對象組合通常爲“黑箱複用”

  • 繼承在某種程度上破壞了封裝性,子類父類耦合度高

  • 而對象組合則只要求被組合的對象具有良好定義的接口,耦合度低

7. 封裝變化點

  • 使用封裝來創建對象之間的分界層,讓設計者可以在分界層的一側進行修改,而不會對另一側產生不良的影響,從而實現層次間的鬆耦合

8. 針對接口編程,而不是針對實現編程

  • 不將變量類型聲明爲某個特定的具體類,而是聲明爲某個接口

  • 客戶程序無需獲知對象的具體類型,只需要知道對象所具有的接口

  • 減少系統中各部分的依賴關係,從而實現“高內聚、鬆耦合”的類型設計方案


產業強盛的標誌: 接口標誌化


從封裝變化角度對模式分類


重構關鍵技法:

  • 靜態 --> 動態
  • 早綁定 --> 晚綁定
  • 繼承 --> 組合
  • 緊耦合 --> 鬆耦合
  • 編譯時依賴 --> 運行時依賴
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章