天天看點

寂然解讀設計模式 - 合成複用原則

I walk very slowly, but I never walk backwards            

設計模式原則 - 合成複用原則

​ 寂然

大家好~,我是寂然,本節課呢,我來給大家介紹設計模式原則之合成複用原則,這是設計模式原則的最後一個,結尾部分也和大家聊聊設計原則的核心思想,老規矩,首先帶大家了解一下合成複用原則的官方定義,并作一個解釋說明,然後我們通過案例來具體分析

官方定義

合成複用原則(Composite Reuse Principle)的官方定義如下:

Try to use composition / aggregation instead of inheritance

( 盡量使用組合/聚合的方式,而不是使用繼承 )

基本介紹

合成複用原則的思想在定義了得到了明确的展現,他就是推薦我們使用聚合或者組合的方式來代替繼承關系,那繼承關系大家已經很熟悉了,聚合群組合我們也會在下一章節結合UML類圖進行詳細的介紹,是以這裡我們先不去系統說明,本節的重點放在體會了解合成複用原則上,下面我看一個案例來進行說明

案例示範 - 如何複用??

現在假設有一個A類,裡面有兩個方法,有一個類B想要複用這兩個方法,請問有幾種方案

OK,明确了需求我們一起來聊一下解決方案,首先大家想,最容易想到的就是繼承,B類隻要繼承A類,就可以複用A類的方法,相關的類圖如下圖所示

寂然解讀設計模式 - 合成複用原則

那這種方案肯定是不好,因為大家接觸了前面的一些原則,很容易就會想到這會讓B類和A類的耦合性增強,A類的其他方法可能B類并不想複用,但是也繼承下來了,那有的小夥伴說,我可以在B類增加一個屬性,類型為A,通過set的方式傳入值,就可以複用A類的方法了,這同樣是一種解決方案,相關的類圖如下圖所示

寂然解讀設計模式 - 合成複用原則

同樣,我們也可以把類A當作B類方法入參的類型,也可以達到複用的效果,相關的類圖如下圖所示

寂然解讀設計模式 - 合成複用原則

案例總結

也就是說,案例中後面的兩種方式就是合成複用原則推薦我們使用的,方案二其實就是聚合,方案三是依賴關系

他不推薦我們為了複用代碼使用繼承的方式,這樣會導緻類與類之間的強耦合,這其實就是合成複用原則的思想

當然,如果要使用繼承關系,則必須嚴格遵循裡氏替換原則,合成複用原則同裡氏替換原則相輔相成的,兩者都是

開閉原則的具體實作規範

設計原則總結

結合前幾節的内容,我們一共介紹了 7 種設計原則,它們分别為開閉原則,裡氏替換原則、依賴倒置原則、單一職責原則、接口隔離原則、迪米特法則和本節所介紹的合成複用原則

這 7 種設計原則是軟體設計模式必須盡量遵循的原則,各種原則要求的側重點不同,其中,開閉原則是總綱,是最基礎的設計原則,其它的五個設計原則都是開閉原則的具體形态

開閉原則 - 要對擴充開放,對修改關閉

裡氏替換原則 - 不要破壞繼承體系

依賴倒置原則 - 要面向接口程式設計

單一職責原則 - 實作類要職責單一

接口隔離原則 - 在設計接口的時候要精簡單一

迪米特法則 - 隻與直接的朋友通信

合成複用原則- 要優先使用組合或者聚合關系複用,少用繼承關系複用

設計原則的核心思想

上面進行了回顧以後,其實設計原則總結起來,都是圍繞着下面的三點,這裡列舉出來,大家結合設計原則的概念,加深了解,還是那句話,遵循設計原則,讓程式呈現出高内聚,低耦合的特性

  • 找出應用中可能需要變化之處,把它們獨立出來,不要和那些不需要變化的代碼混在一起
  • 針對接口程式設計,而不是針對實作程式設計
  • 為了互動對象的松耦合設計而努力

下節預告

OK,下一節,我們正式進入第二篇章,UML類圖及類的六大關系的學習,UML類圖是我們後面講解設計模式經常用到的,類圖關系也是設計模式必備的知識,最後,希望大家在學習的過程中,能夠感覺到設計模式的有趣之處,高效而愉快的學習,那我們下期見~

繼續閱讀