對結構型設計模式之間區別的一點點認識

2021-10-14 09:33:21 字數 1556 閱讀 6871

前提是對設計模式有一定的認識。

1.**模式

含義通過繼承的方式,控制外界對原物件的訪問。**模式要求**物件和原物件實現相同的介面(cglib 通過繼承原物件的類實現)。

外界對其不可感知,不知道其實是訪問經過了**物件,到達實際物件。對於外界來講,只知道**物件;對於內部來講,被**物件所有行為都被攔截,不可以替換、不可以通過外部傳入被**物件。

意圖**模式在不改變原始類介面的條件下,為原始類定義乙個**類,主要目的是控制訪問,而非加強功能,這是它跟裝飾器模式最大的不同。主要增強的是非主幹或者說非業務性的功能。

比如事務、日誌記錄、資料庫連線等等。

2.橋接模式

含義兩個具備多種變化(即多種實現)的類體系之間的解耦,方便兩個體系的擴充套件導致類膨脹的問題。聚合的實際是兩個類體系的最頂上的抽象概念。

兩個類體系都可以自有擴充套件,而不影響原來的使用。因為都是聚合了抽象概念的類或介面。

注:抽象概念代表的不是單一的類或介面,實際是被抽象出的一組可擴充套件的類庫。

原則:「依賴倒轉原則"與"開閉原則」。意圖

更關注的是兩個體系之間其實是一種整體和部分的關係。

比如《headfirst 設計模式》中提到的鴨子和叫聲的關聯。定義了鴨子的抽象概念,組合了叫聲的抽象概念。

乙個鴨子的實現,組合了一種叫聲的實現,還可以替換,皮不皮。

鴨子和叫聲之間都可以自有擴充套件、組合。

3.組合模式

類似於 uml 中組合的關係,是一種整體和部分不可分割的概念。

最關鍵的點,在於使客戶端以一致的方式對待單個物件和物件組合。注:實現相同介面

比如命令和巨集命令,客戶端只在乎執行命令,內部如何執行是命令自己的事。

4.裝飾器模式

意圖對原始類功能的增強,是和原功能有相同業務含義的。

裝飾類和原物件都繼承了同樣的物件,並通過聚合的方式管理被裝飾的物件或物件組。

方式:繼承或關聯

原則:組合復用、開閉原則

5.介面卡模式

這個區別,最好得去使用意圖上去區分。字面理解,認為是為了解決使用類和被使用類之間(比如說專案與第三方類庫之間)不相容的問題而使用的。主要提供跟原始類不同的介面

像**和裝飾,都是與原始類相同的介面

原則:開閉。

意圖舉個不是貼切的例子,第三方介面某個引數使用 string 型別,而在專案中這個對應概念是 long 型別。通過介面卡模式,得到乙個適配介面。專案使用這個介面傳入 long,然後內部轉化為 string 再呼叫第三方介面。

為了不讓這部分沒有業務意義的**影響業務**,從而使用。

6.門面模式

防止使用者與多個子系統之間的耦合,通過 facade 提供完整意義的功能並遮蔽掉複雜的呼叫關係。

原則: 「迪公尺特原則」。

意圖比如出門 ,要關閉燈、空調、暖氣、音箱等等電器。使用者需要一一關閉各個電器,而通過 facade 提供乙個總開關介面,通過 facade 去一一關閉各個電器。

對設計一點感觸

今天,稍微參悟了下 spring框架。裡面提到了 3種類 物件解耦的方式 介面注入 setter注入 構造注入 前一種 比較傾向與純物件導向的設計思想,主要通過介面來實現類 物件兩兩之間的耦合問題。在真正實現方案時,比較偏向於應用設計模式來解決一切物件之間的問題,對反射應用不是很多。後兩種 比較傾向...

設計模式 結構型軟體設計模式 一

組合模式允許一致的對待複雜和原始物件的介面,在物件導向程式設計技術中,組合物件是乙個或者多個相似物件構成的物件,各個物件有相似的功能。關鍵的概念是客戶類以相同的方式對待單獨的物件與一組物件,即所謂的組合物件。組合模式有時候又叫做部分 整體模式,在樹形結構中模糊了簡單元素和複雜元素的概念,客戶程式可以...

golang 對 與new的一點小區別的理解

post請求引數 data g.log info post請求返回內容 content result gconv.map content fmt.printf t n resp 該處 resp的一點理解,對resp型別進行初始化 不一定都是各型別的零值 並返回指向該物件的指標 與new的區別,new...