設計模式學習(一)
阿新 • • 發佈:2020-03-02
# 一、學習設計模式的目的
> 懂了設計模式,你就懂了面向物件分析和設計(OOA/D)的精要。
1. 程式碼重用性(相同功能的程式碼不需要多次編寫)
2. 可讀性(規範程式設計,便於其他開發人員閱讀和理解)
3. 可擴充套件性(當需要增加新功能的時候,非常方便)
4. 可靠性(當我們增加新功能後,對原有的功能沒有影響)
5. 使程式呈現高內聚、低耦合的特性(高內聚:儘可能類的每個成員方法只完成一件事(最大限度的聚合); 低耦合:減少類內部,一個成員方法呼叫另一個成員方法。)
# 二、設計模式的七大原則
設計模式原則就是開發者在程式設計時應當遵守的原則,也是各種設計模式的基礎(即:設計模式為什麼這麼設計的依據)。
- 單一職責原則
- 介面隔離原則
- 依賴倒置原則
- 里氏替換原則
- 開閉原則
- 迪米特法則
- 合成複用原則
## 1.單一職責原則
對類來說,一個類應該只負責一項職責。例如,類A負責兩個不同的職責:職責1,職責2;當職責1需求改變的時候,可能會導致職責2出錯,所以應當執行單一職責原則,將類A的粒度分解為A1、A2。
**注意事項與細節:**
1)降低類的複雜度,一個類只負責一項職責
2)提高類的可讀性、可維護性
3)降低變更引起的風險
4)通常情況下,我們應當遵循單一職責原則,除非邏輯足夠簡單
------
## 2.介面隔離原則
客戶端不應該依賴他不需要的介面,即**一個類對另一個類的依賴應該建立在最小介面上**
-------
## 3.依賴倒置原則
1)高層模組不應該依賴低層模組,二者都應該依賴其抽象
2)抽象不應該依賴細節,細節應該依賴抽象
3)依賴倒置原則的中心思想是面向介面程式設計
4)依賴倒置原則是基於這樣的設計理念:相對於細節的多變性,抽象的東西要穩定的多。以抽象為基礎搭建的架構比以細節為基礎的架構穩定得多。在java中,抽象指的是介面或抽象類,細節就是具體的實現類。
5)使用介面或抽象類的目的是制定好規範,將具體的細節交給他們的實現類或子類去完成
**注意事項與細節:**
1)低層模組儘量都有抽象類或介面,這樣程式穩定性更好
2)變數的宣告型別儘量都是抽象類或介面,這樣我們的變數引用和實際物件間就有一個緩衝層,更利於程式的優化和擴充套件
3)繼承時遵循里氏替換原則
----
## 4.里氏替換原則
**關於面向物件中的繼承性的思考:**
- 繼承包含這樣一層含義:父類中定義好的方法,實際上是制定了一些契約,雖然它不強制要求子類遵循這些契約,但如果子類對這些已經實現的方法隨意修改,則會造成整個繼承體系的混亂
- 繼承給程式帶來便利的同時,也帶來了一些弊端,比如使用繼承會給程式帶來侵入性,程式可移植性降低,增加了類與類之間的耦合,如果一個類被其它類繼承,那麼這個類的每一次改動都要考慮到其子類
**因此,我們需要遵循里氏替換原則,即:**
1)所有引用基類的地方必須能夠透明的使用其子類的物件
2)子類儘量不要重寫父類的方法
3)在適當的情況下,可以通過聚合、組合、依賴來解決問題
----
## 5.開閉原則
開閉原則是程式設計中最基礎、最重要的設計原則,當我們需要對一個程式進行擴充套件的時候,儘量通過擴充套件軟體實體的行為來實現變化,而不是通過修改已有的程式碼來實現變化,程式設計中遵循其他原則,以及使用設計模式的目的就是遵頊開閉原則。
## 6.迪米特法則
1)一個物件應該對其他物件保持最少的瞭解
2)類與類關係越密切,耦合度越高
3)最少知道原則,即一個類對自己依賴的類知道的越少越好,也就是說,對於被依賴的類不管多麼複雜,都儘量將邏輯封裝在類的內部,對外只提供public方法
4)迪米特法則還有個更簡單的定義:只與**直接的朋友**通訊,直接的朋友
![](https://gitee.com/songjilong/FigureBed/raw/master/img/20200302194507.png)
**注意事項與細節:**
迪米特法則的核心是降低類之間的耦合,注意,是降低,並不是要求類與類之間完全沒有依賴
## 7.合成複用原則
原則是儘量使用合成/聚合的方式,不使用繼承的方式
**核心思想:**
1)找出應用中可能需要變化之處,把它們獨立出來,不要和那些不需要變化的程式碼混在一起。
2)針對介面程式設計,而不是針對實現程式設計
3)為了互動物件之間的鬆耦合設計