設計模式 - 七大原則

閒談設計模式 - 七大原則

懂了設計模式,你就懂了面向對象分析和設計(OOA/D)的精要.

一、設計模式的目的

編寫軟件的過程,面臨 == 耦合性、內聚性、維護性、可擴展性、重用性、靈活性== 等各方面的挑戰。

設計模式就是爲了解決這些問題

  • 代碼重用性:相同功能代碼,不寫多次
  • 可讀性:編程規範性,利於閱讀和理解
  • 可擴展性:增加新的功能非常方便
  • 可靠性:當增加新的功能後對原來功能沒有影響

二、設計模式七大原則

編程時遵循的原則,各種設計模式的基礎

1. 單一職責原則

  • 基本介紹

    對類來說,一個類只負責一項職責,如果 A 負責兩個不同職責:職責1,職責2.

    當職責1 需求變更的時候改變 A,可能會造成 職責2 執行錯誤,職責2 同理。

    所以需要將 類A 的粒度分解成 A1 , A2

  • 注意事項和細節

    • 降低類的複雜度,一個類只負責一項職責
    • 提高類的可讀性,可維護性
    • 降低變更引起的風險

2.接口隔離原則

  • 基本介紹

    客戶端不應該依賴它不需要的接口,也就是說 一個類的依賴應該建立在最小的接口上

  • 處理方法

    將一個接口拆分成幾個獨立的接口,當類需要的時候多實現就可以

3.依賴倒轉原則(Dependence Inversion Principle)

  • 基本介紹
    • 高層模塊不應該依賴底層模塊,二者都應該是依賴抽象
    • 抽象不應該依賴細節,細節應該依賴抽象
    • 依賴倒轉(倒置)的中心思想是面向接口編程
    • 依賴倒轉原則是基於這樣的設計理念:相對於細節的多邊形,抽象的東西要穩定的多。以抽象爲基礎搭建的架構比細節爲基礎的架構穩定的多。在Java中,抽象指的是接口或抽象類,細節是具體的實現類
    • 使用接口或抽象類的目的是 指定好規範,而不涉及任何具體的操作,把展現細節的任務交給實現類
  • 注意事項和細節
    • 低層模塊儘量都有抽象類和接口,或者兩者都有程序穩定性更好。
    • 變量的聲明類型儘量是抽象類或者接口,這樣在變量的引用和 實際對象間存在緩衝層,利於程序拓展和優化
    • 繼承時遵循里氏替換原則

4.里氏替換原則

  • 前言思考

    • 繼承包含這層含義:父類中凡是已經實現好的方法,實際上是在設定規範和契約,雖然不強制要求所有的子類必須遵循這些契約,但是如果子類對這些已經實現的方法任意修改,就會對整個繼承體系造成破壞
    • 繼承在給程序設計帶來便利的同時,也帶來了弊端,比如使用繼承會給程序帶來侵入性,程序的可移植性降低,增加對象間的耦合性,如果一個類被其他的類所繼承,則這個需要修改時,必須考慮到所有子類,並且父類修改後,所有涉及的子類的功能都有可能產生故障

    那麼問題來了,如何正確使用繼承?

    答案:里氏替換原則

  • 基本介紹

    1. 如果對每個類型 爲 T1 的對象 o1,都有類型爲 T2 的對象 o2,使得以 T1定義的所有程序 P 在所有的對象o1都代替成 o2時,程序P的行爲沒有發生變化,那麼類型T2是類型T1的子類型。也就是,所有引用父類的地方必須能透明地使用其子類對象

    2. 在使用繼承時 ,遵循里氏替換原則,在子類中儘量不要重寫父類的方法

    3. 繼承實際上讓兩個類耦合性增強了,在適當情況下,可以通過聚合、組合、依賴 來解決問題

  • 解決方法

    類B 繼承 類A 並重寫父類方法,造成原有功能錯誤

    實際編程中,常常會重寫父類的方法完成新功能,這樣寫起來雖然簡單,但是整個繼承體系的複用性比較差,特別是運行多態比較頻繁的時候

    解決方法

    原來的父類和子類都繼承一個更通俗(抽象)的基類,原有的繼承關係去掉,採用依賴、聚合、組合等關係代替

5.開閉原則

  • 基本介紹

    1. 開閉原則(Open Closed Principle)是編程中最基礎、最重要的設計原則

    2. 一個軟件實體 如 類、模塊、函數 應該對外開放,對修改關閉。用抽象構建框架,用實現擴展細節

    3. 當軟件需要變化時,儘量通過擴展軟件實體的行爲來實現變化,而不是通過修改已有的代碼來實現變化

    4. 編程中遵循其他原則,以及使用設計模式的目的就是遵循開閉原則

6.迪米特法則(降低類之間的耦合度)

  • 基本介紹

    1. 一個對象應該對其他對象保持最少的瞭解

    2. 類與類關係越密切,耦合度越大

    3. 迪米特法則(Demeter Principle - 最少知道法則):一個類對自己依賴的類知道的越少越好。也就是,對於被依賴的類不管多麼複雜,都儘量將邏輯封裝在類的內部。對外除了提供的 public 方法,不對外泄露任何信息

    4. 更簡單的定義:只與直接的朋友通信

      直接的朋友:每個對象都會與其他對象有耦合關係,只要兩個對象之間有耦合關係,就說這兩個對象之間是朋友關係。耦合的方式很多,依賴、關聯、組合、聚合 等。其中,我們稱出現成員變量,方法參數,方法返回值中的類爲直接的朋友,而出現在局部變量中的類不是直接的朋友。也就是說,陌生的類最好不要以局部變量的形式出現在類的內部。

  • 注意事項和細節

    1. 迪米特法則的核心是降低類之間的耦合度
    2. 由於每個類都減少不了不必要的依賴,因此迪米特法則只是要求降低類之間的耦合關係,並不是要求完全沒有依賴關係

7.合成複用原則(Composite Reuse Principle)

  • 基本介紹

    原則是儘量使用合成/聚合的方式,而不是繼承

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章