Java設計模式中的設計原則之合成復用原則詳解
一、基本介紹
原則是盡量使用合成/聚合的方式,而不是使用繼承
聚合關(guān)系(Aggregation)表示的是整體和部分的關(guān)系,整體與部分可以分開。 可以理解為成員變量和當前類的關(guān)系就是聚合關(guān)系。
public class A{<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->private B b;}
組合關(guān)系:也是整體與部分的關(guān)系,但是整體與部分不可以分開。也就是假如我創(chuàng)建A類,A類當中有個成員變量是B,而B也會隨著A的創(chuàng)建進行實例化,這種叫組合關(guān)系。
public class A{ private B b = new B(); }
如果要使用繼承關(guān)系,則必須嚴格遵循里氏替換原則。合成復用原則同里氏替換原則相輔相成的,兩者都是開閉原則的具體實現(xiàn)規(guī)范。
時刻記住一句話:針對接口編程,而不是針對實現(xiàn)編程
合成復用原則的重要性
- 通常類的復用分為繼承復用和合成復用兩種,繼承復用雖然有簡單和易實現(xiàn)的優(yōu)點,但它也存在以下缺點。繼承復用破壞了類的封裝性。因為繼承會將父類的實現(xiàn)細節(jié)暴露給子類,父類對子類是透明的,所以這種復用又稱為“白箱”復用。
- 子類與父類的耦合度高。父類的實現(xiàn)的任何改變都會導致子類的實現(xiàn)發(fā)生變化,這不利于類的擴展與維護。
- 它限制了復用的靈活性。從父類繼承而來的實現(xiàn)是靜態(tài)的,在編譯時已經(jīng)定義,所以在運行時不可能發(fā)生變化。
采用組合或聚合復用時,可以將已有對象納入新對象中,使之成為新對象的一部分,新對象可以調(diào)用已有對象的功能,它有以下優(yōu)點。
- 它維持了類的封裝性。因為成分對象的內(nèi)部細節(jié)是新對象看不見的,所以這種復用又稱為“黑箱”復用。
- 新舊類之間的耦合度低。這種復用所需的依賴較少,新對象存取成分對象的唯一方法是通過成分對象的接口。
- 復用的靈活性高。這種復用可以在運行時動態(tài)進行,新對象可以動態(tài)地引用與成分對象類型相同的對象。
二、應用實例
1、示例一
發(fā)現(xiàn)問題 :假如我有一個類為C,他和D類有同樣的方法update,Test2類難道也要繼承C嗎?
public class Test2 extends D { public void add() { update(); } } class D { public void update() { } }
2、示例二
去除繼承關(guān)系,抽出來一個接口A,將A接口和Test1作為聚合關(guān)系,有必要的話也可以改為組合關(guān)系。這樣一來代碼耦合度就降低了,同時代碼也變得不是那么死板了。
public class Test1 { private A a; public void add() { a = new B(); a.update(); } } interface A { void update(); } class B implements A { @Override public void update() { } }
到此這篇關(guān)于Java設計模式中的設計原則之合成復用原則詳解的文章就介紹到這了,更多相關(guān)Java合成復用原則內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Scala實現(xiàn)冒泡排序、歸并排序和快速排序的示例代碼
這篇文章主要介紹了Scala實現(xiàn)冒泡排序、歸并排序和快速排序的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-06-06springboot @RequiredArgsConstructor的概念與使用方式
這篇文章主要介紹了springboot @RequiredArgsConstructor的概念與使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-09-09java中用數(shù)組實現(xiàn)環(huán)形隊列的示例代碼
這篇文章主要介紹了java中用數(shù)組實現(xiàn)環(huán)形隊列的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-04-04SpringCache常用注解及key中參數(shù)值為null問題解析
這篇文章主要介紹了SpringCache常用注解及key中參數(shù)值為null的問題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09