Design pattern 第一講 基礎知識

寧十一發表於2020-12-26

Design pattern 基礎知識

一、基本原則

1、單一職責原則(Single Responsibility Principle)

一個物件應該只包含單一的職責,並且該職責被完整的封裝在一個類中。
單一職責原理是實現高內聚、低耦合的指導方針。

2、開閉原則(Open-Closed Principle)

一個軟體實體應當對擴充套件開放,對修改關閉。也就是說,在設計一個模組的時候,應當使這個模組可以在不被修改的前提下被擴充套件,即實現在不修改原始碼的情況下改變這個模組的行為。
為了滿足開閉原則,需要對系統櫃進行抽象化設計,抽象化是開閉原則的關鍵。

3、里氏代換原則(Liskov Substitution Principle)

所有引用父類的地方必須能夠透明地使用其子類的物件。
通俗而言:在軟體中如何能夠使用父類物件,那麼一定能夠使用其子類物件。把基類都替換成它的子類,程式將不會產生任何錯誤和異常,反過來則不成立,如果一個軟體實體使用的是一個子類的話,那麼它不一定能夠使用基類。

  • 子類的所有方法必須在父類中宣告,或者子類必須實現父類中宣告的所有方法。
  • 在運用里氏代換原則,儘量把父類設計成抽象類和介面,讓子類繼承父類或者實現介面,並實現在父類中宣告的方法,執行時,子類例項替換父類例項。
  • Java語言中,在編譯階段,Java編譯器會檢查一個程式是否符合里氏代換原則,這是一個與實現無關,純語法上的檢查,但是檢查有限。

4、依賴倒轉原則(Dependence Inversion Principle)

高層模組不應該依賴低層模組,他們都應該依賴抽象。抽象不依賴於細節,細節應該依賴於抽象。
即要針對介面程式設計,不要針對實現程式設計。
依賴倒轉原則是指:程式碼要依賴於抽象的類,而不要依賴具體的類,要針對介面或者抽象類程式設計,而不是針對具體類程式設計。
實現開閉原則的關鍵是抽象化,並且從抽象化匯出具體化實現。
依賴倒轉原則的常用實現方式之一是在程式碼中使用抽象類,而將具體類放在配置檔案中。
依賴注入(Dependence Injection)是如何傳遞物件之間的依賴關係,簡單來說就是將一個類的物件傳入另一個類,注入時應該儘量注入父類物件,而在程式執行的時候再通過子類物件來覆蓋父類物件。注入有三種方式:

  • 構造注入
  • 設值注入
  • 介面注入

5、介面隔離原則(Interface Segregation Principle)

客戶端不應該依賴那些它不需要的介面(方法)。
介面隔離原則是指使用多個專門的介面,而不是使用單一的總介面。
使用介面隔離原則拆分介面時,必須滿足單一職責原則,將一組相關的操作定義在一個介面中,且在滿足高內聚的前提下,介面中的方法越少越好。可以在進行系統設計時採用定製服務的方式,即為不同的客戶提供寬窄不同的介面,只提供使用者需要的行為,而隱藏使用者不需要的行為。

6、合成複用原則(Composite Reuse Principle)

儘量使用物件組合,而不是繼承來達到複用的目的。即儘量使用組合/聚合關係,少用繼承。
白箱複用:通過繼承來實現複用很簡單,也易於擴充套件,但是繼承複用會破壞系統的封裝性,因為繼承會將基類的實現細節暴露給子類,即基類的某些內部細節對於子類來說是可見的。
黑箱複用:組合或聚合關係可以將已有的物件納入到新物件中,使之成為新物件的一部分,因此新物件可以呼叫已有物件的功能,這樣做可以使得成員物件的內部實現細節對於新物件是不可見的,這種複用稱為黑箱複用。
合成複用可以在執行時動態進行,新物件可以動態地引用與成員物件型別相同的其他物件。

7、迪米特法則(Law of Demeter)

狹義:如果兩類之間不必彼此之間直接通訊,那麼這兩個類就不當發生直接的相互作用。
廣義:物件之間的資訊流量、流向以及資訊的影響的控制,主要是對資訊隱藏的控制。
其意義就是一個軟體應當儘可能減少與其它實體發生作用。

二、 類之間的關係

1、關聯關係(Association)

最常見的一種關係,是一種結構化的關係,用於表一類物件與另一類物件之間有聯絡。程式語言中,通常把一個類的物件作為另一個類的屬性。通常使用實線連線。

  • 聚合關係(Aggregation):表示一個整體和部分的關係,部分可以作為獨立存在,比如說汽車發動機和汽車,通常使用空心菱形實線箭頭表示,程式設計中常用SET注入;
  • 組合關係(Composition):表示一個整體和部分的關係,部分無法脫離整體,部分和整體有統一的生存期,同生共死,比如頭部和嘴巴,一般使用實心菱形箭頭表示,程式設計中使用construct注入。

2、依賴關係(Dependence)

依賴關係是一種使用關係,特定事物的改變有可能會影響到使用該事物的其他事務,在需要表示一個事物使用另一個事物時使用依賴關係。
大多數情況下,依賴關係體現在某個類的方法使用另一個類的物件作為引數。使用虛線箭頭表示。

3、泛化(Generalization)

即繼承,使用空心三角形直線表示

4、實現(Realization)

介面和其實現類之間的關係,使用空心三角形虛線表示。