1. 程式人生 > >設計模式學習(一)

設計模式學習(一)

# 一、學習設計模式的目的 > 懂了設計模式,你就懂了面向物件分析和設計(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)為了互動物件之間的鬆耦合設計