首頁 > 軟體

Java設計模式中的七大原則詳細講解

2023-02-20 06:01:10

設計模式要進行共性與可變性的分析,對共性進行抽象,同時對可變性進行封裝,沒有完美的設計模式,作為一名開發者要懂得取捨,觸類旁通,開發出高內聚、低耦合、靈活性更高的軟體產品

1.開閉原則(軟體設計第一原則) 

定義:一個軟體實體應該對擴充套件開放,對修改關閉,即在不修改原始碼的基礎上擴充套件軟體功能

本質思想:

  • 以抽象來固定不變的東西(把固定不變的抽出來)
  • 使用具體實現對可變性進行封裝/隱藏
  • 面向抽象程式設計

2.依賴倒置原則

開閉原則是目標,依賴倒置是手段

三層含義:

  • 高層模組不應該依賴於低層模組,兩者都應該依賴其抽象(例如一個類的成員變數、方法的入參、返回值不應該是一個具體類,而最好是一個抽象類)
  • 抽象不應該依賴細節(業務程式碼不關心具體類)
  • 細節應該依賴抽象(業務程式碼只關心抽象類)

依賴倒置原則的核心就是面向抽象(抽象類或者介面)程式設計

3.里氏替換原則

定義:在一個軟體產品中,父類別物件可以出現的地方,都可以替換成它的子類物件,且不能發生錯誤和異常,里氏替換原則為良好的繼承定義了規範

四層含義:

  • 子類必須完全實現父類別的抽象方法,但不能覆蓋(重寫)父類別的非抽象方法
  • 子類可以增加自己特有的方法
  • 當子類一定要重寫父類別的方法時,子類方法的形參(前置條件)要比父類別更寬鬆(例如父類別使用HashMap,子類使用Map)
  • 當子類實現父類別的抽象方法時,方法的返回值(後置條件)要比父類別更加嚴格

總結:子類可以擴充套件父類別的功能,但是不能去改變父類別原有的功能(遵循父類別原有的基礎特性,進行一系列的行為變化)

4.合成複用原則

定義:在軟體複用時,要儘量使用組合/聚合(has a)等關聯關係來實現,即組合/聚合優先於繼承

如果要使用繼承關係,則必須嚴格遵循里氏替換原則

合成複用原則和里氏替換原則是相輔相成的,兩者都是開閉原則的具體實現規範

設計模式用繼承對行為變化進行分類,而不是使用繼承來複用邏輯

  • 繼承破壞了類的封裝性,父類別的實現細節全都暴露給子類了
  • 父類別和子類的耦合性太高,父類別的修改直接影響子類
  • 繼承是靜態的,與IOC動態注入相違背

5.介面隔離原則

定義:使用多個專門的介面,而不是使用單一的總介面;使用者端呼叫者程式碼不應該依賴它不需要的介面

使用原則:

  • 根據介面隔離原則拆分介面時,首先必須滿足單一職責原則
  • 提高高內聚(每個介面都只負責相互獨立的部分,方法間都是強相關的)
  • 客製化服務
  • 介面設計要有限度(不要讓類過於膨脹)

目標:在發生程式碼變更,介面變更的情況下,儘量做到影響程度最低

6.迪米特法則

  • 規則:一個類應該儘量少的對其他類相互作用(依賴/呼叫)
  • 解釋:只與直接朋友(私有成員變數、方法入參、new的物件)進行通訊,間接朋友:呼叫直接朋友的方法獲取到的物件
  • 目的:讓類之間解耦,提高類的複用性,當其他類發生變更的時候,對這個類的影響才最小
  • 缺點:過於嚴格的遵守此原則,會導致系統產生大量透明的小方法,需要在朋友數量和小方法之間進行權衡

通過下面的例子加深理解,Person類想呼叫Stranger類執行一些邏輯

public class Person {
    private Friend friend = null;
    // 遵循迪米特法則
    // 將Stranger類封裝/隱藏了,Person類不知道Stranger類的存在
    // 但是Friend類產生了callStrangerDoSomething這個透明的小方法
    public void right(){
        friend.callStrangerDoSomething();
    }
    // 不遵循迪米特法則
    // 與Stranger類耦合了
    public void wrong(){
        Stranger stranger = friend.getStranger();
        stranger.doSomething();
    }
}

7.單一職責原則

  • 單一職責原則要求一個介面或類只有一個原因引起變化(職責的範圍因人而異)
  • 一個介面或一個類只負責一件明確的事,負責的事情越少越好
  • 如果其他類依賴了一個包含多個職責的類,也會將不需要的職責包含進來,也違反了迪米特法則

到此這篇關於Java設計模式中的七大原則詳細講解的文章就介紹到這了,更多相關Java設計模式原則內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com