設計模式對比篇

對比篇

關於設計模式,有時你會發現有些設計模式的類圖是有些相似的但也不完全相同,但是功能卻不相同,這時我便常用對比的方式讓自己更熟練的掌握這些設計模式。

續前4篇

設計模式初篇
設計模式精髓篇之創建型
設計模式精髓篇之結構型
設計模式精髓篇之行爲型

抽象工廠和建造者模式的對比

類圖:


(此處圖片摘自網絡)

描述

抽象工廠:爲創建一組相關或相互依賴的對象提供一個接口,而無需指定他們的具體類。
建造者模式:將一個複雜的對象的構建和它的表示分離,使得同樣的構建過程能創建出不同的表示。

差異

,兩種設計模式目的都是將一個要創建的複雜對象進行拆分出去,並且都是將具體的實現交給子類,父類不直接創建實現。
抽象工廠要拆分的是一個工廠或者說系統內的不同子系統對象,而子系統還是一個相對複雜的系統對象,其中系統中子系統對象之間是相對整體獨立的,而子系統間的對象是整體與部分的關係,這點類似於建造者模式。建造者模式要拆分的是一個複雜的整體對象,拆分一個待實現的子部分,並且具體的子部分交由具體的Builder者去實現。可以理解爲代理的方式,將對象的子部分代理給Builder者去實現。也可以理解爲模板模式,由父類創建好算法結構,具體的算法實現交由Builder接口去實現。
使用偏好建造者模式常用在要創建一個由依賴的部分組成的整體的複雜對象,具體的創建過程交由Builder(接口或者說代理者)去實現。抽象工廠常用在創建獨立的多個整體對象,每個整體對象又是抽象的,具體實現又交由子類去具體創建。

JDK中使用參考及詳細描述:建造者模式 AND 抽象工廠

裝飾模式和適配器模式的對比

類圖:


(此處圖片摘自網絡)

描述

裝飾模式:動態的給一個對象添加額外的職責,比使用生成子類來添加對象功能更加靈活。
適配器模式:將一個的接口轉換成使需要的另外一種接口,從而使原本因接口不匹配的兩個類能一塊工作。

差異

同,兩種設計模式都是使用接口的方式給對象添加功能。
異,從定義上理解,裝飾模式,是以擴展的方式給對象動態添加功能。而適配器模式,是在原對象的已有功能的基礎上,就某個具體功能加以修改形成新的功能。從設計方式上看,裝飾模式,是通過實現同一個接口,通過類對象間關聯的方式,裝飾者給被裝飾者添加功能。而適配器模式,對象是在兩個接口之間,通過實現target接口來達到轉換原有功能。
使用偏好,裝飾模式,需要擴展一個類的功能或者給你個類增加附加責任;需要動態的給一個對象增加功能,這些功能可以再動態的撤銷;需要增加有一些基本功能的排列組合而產生非常大量的功能,從而使得繼承關係變得不現實。適配器模式,系統需要使用現有的類,但此類已經不符合系統的需要;想要建立一個可以重複使用的類,用於與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的的類一起工作。適配器模式在系統升級的時候使用的頻率很高,對舊系統的一些功能方法在新系統中引用。

JDK中使用參考及詳細描述: 裝飾模式 AND 適配器模式

裝飾模式和代理模式的對比

類圖:


(此處圖片摘自網絡)

描述

裝飾模式:動態的給一個對象添加額外的職責,比使用生成子類來添加對象功能更加靈活。
代理模式:爲其他對象通過一種代理以控制對這個對象的訪問。

差異

同,模式的設計方式相同,模式中的兩大角色都實現同一個接口,並且都是其中一個角色對象關聯到另外一個角色對象上,進而實現相應的操作。裝飾模式,裝飾者角色對象關聯被裝飾者角色對象,從而在被裝飾者對象上動態添加功能。代理模式,代理角色對象關聯被代理角色對象,從而控制其他對象訪問被代理對象。
異,目的不同,裝飾模式,是以給被裝飾者添加功能爲目的。代理模式,是以控制其他對象訪問被代理對象爲目的。實現方式不同,裝飾模式,往往在關聯的被裝飾者對象上添加額外的處理代碼(功能性)代碼,代理模式,往往在被關聯的被代理者對象上添加條件控制性代碼,當然如果是面向切面編程的時候另說。
使用偏好,代理模式,常用在訪問一個類時做一些控制。
裝飾模式,常用在不想增加很多子類的情況下擴展類。

JDK中使用參考及詳細描述:裝飾者模式 AND 代理模式

命令模式和訪問者模式的對比

類圖:


(此處圖片摘自網絡)

描述:

命令模式:對一個請求或命令的封裝在命令對象中,從而對請求者和操作者進行解耦,通過使用不同的請求把操作者參數化,也可以對請求做一下相關處理,請求排隊,記錄日誌,撤銷和恢復等操作。
訪問者模式:封裝一下作用於某種數據結構中各元素的操作,可以在不改變數據結構的情況下定義作用於這些數據結構元素的新的操作。

差異

同,兩種設計模式都是對操作來進行封裝因爲兩種模式中的操作都是多變可生成多種的。命令模式,封裝的是請求操作。訪問者模式,封裝的是對某個數據結構的操作。
異,設計思想的不同,命令模式,重點是爲了對命令請求者和命令接受者兩種角色間的解耦,對於命令接受者,能對請求進行參數化操作,請求排隊,撤銷或恢復的操作。訪問者模式,重點是在操作接受者(數據結構元素)和對數據結構元素的新操作的添加和定義上。
使用偏好,命令模式,常用在要對行爲操作進行”記錄、撤銷/重做、事務”等處理,並且需要對抵禦變化的緊耦合,能實現”行爲請求者”與”行爲實現者”的解耦。訪問者模式,需要對一個對象結構中的對象進行很多不同的並且不相關的操作,而需要避免讓這些操作”污染”(不改變該對象的數據結構)這些對象的類。

JDK中使用參考及詳細描述:命令模式 AND 訪問者模式

感想

**從模式中來,到模式中去**
“從模式中來”,主要是在JDK中學習三大類設計模式,和對比模式之間的同異來熟練掌握設計模式。
“到模式中去”,主要是通過熟練掌握設計模式,能思索出一套屬於自己的設計模式,也開始能領悟出一套自己的編程技巧和編程習慣的方式。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章