1. 依賴倒置原則(DIP)
-
高層模塊(穩定)不應該依賴於低層模塊(變化),二者都應該依賴於抽象(穩定)
-
抽象(穩定)不應該依賴於實現細節(變化) ,實現細節應該依賴於抽象(穩定)
目的:隔離變化,模塊分開
2. 開閉原則(OCP)
-
對擴展開放,對更改封閉
-
類模塊應該是可擴展的,但是不可修改
思路:需要更改,應該是去擴展,而不是滿世界的去找地方改(類比上一節課,每增加一個形狀只需要重新繼承Shape,重載抽象方法;而不用像分解的方法一樣,改動到原先MainForm類的內部邏輯)
3. 單一職責原則(SRP)
-
一個類應該僅有一個引起它變化的原因
-
變化的方向隱含着類的責任。
思路:一個類不應該有過多的功能(職責);如果一個類有多於一個的動機被改變,那麼這個類就具有多於一個的職責
4. Liskov 替換原則(LSP)
-
子類必須能夠替換它們的基類(IS-A)
-
繼承表達類型抽象
思路:當寫子類時發現父類的方法無法適用於子類使用時 ,也許該子類並不應該繼承於此父類
5. 接口隔離原則(ISP)
-
不應該強迫客戶程序依賴它們不用的方法
-
接口應該小而完備
思路: 不要把不必要的方法暴露出去,如果只是子類使用的話設置爲protect,如果只是本類使用則設置爲private
6. 優先使用對象組合,而不是類繼承
-
類繼承通常爲“白箱複用”,對象組合通常爲“黑箱複用”
-
繼承在某種程度上破壞了封裝性,子類父類耦合度高
-
而對象組合則只要求被組合的對象具有良好定義的接口,耦合度低
7. 封裝變化點
- 使用封裝來創建對象之間的分界層,讓設計者可以在分界層的一側進行修改,而不會對另一側產生不良的影響,從而實現層次間的鬆耦合
8. 針對接口編程,而不是針對實現編程
-
不將變量類型聲明爲某個特定的具體類,而是聲明爲某個接口
-
客戶程序無需獲知對象的具體類型,只需要知道對象所具有的接口
-
減少系統中各部分的依賴關係,從而實現“高內聚、鬆耦合”的類型設計方案
產業強盛的標誌: 接口標誌化
從封裝變化角度對模式分類
重構關鍵技法:
- 靜態 --> 動態
- 早綁定 --> 晚綁定
- 繼承 --> 組合
- 緊耦合 --> 鬆耦合
- 編譯時依賴 --> 運行時依賴