Java設(shè)計(jì)模式中的設(shè)計(jì)原則之合成復(fù)用原則詳解
一、基本介紹
原則是盡量使用合成/聚合的方式,而不是使用繼承
聚合關(guān)系(Aggregation)表示的是整體和部分的關(guān)系,整體與部分可以分開。 可以理解為成員變量和當(dāng)前類的關(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類當(dāng)中有個(gè)成員變量是B,而B也會(huì)隨著A的創(chuàng)建進(jìn)行實(shí)例化,這種叫組合關(guān)系。
public class A{
private B b = new B();
}
如果要使用繼承關(guān)系,則必須嚴(yán)格遵循里氏替換原則。合成復(fù)用原則同里氏替換原則相輔相成的,兩者都是開閉原則的具體實(shí)現(xiàn)規(guī)范。
時(shí)刻記住一句話:針對(duì)接口編程,而不是針對(duì)實(shí)現(xiàn)編程
合成復(fù)用原則的重要性
- 通常類的復(fù)用分為繼承復(fù)用和合成復(fù)用兩種,繼承復(fù)用雖然有簡(jiǎn)單和易實(shí)現(xiàn)的優(yōu)點(diǎn),但它也存在以下缺點(diǎn)。繼承復(fù)用破壞了類的封裝性。因?yàn)槔^承會(huì)將父類的實(shí)現(xiàn)細(xì)節(jié)暴露給子類,父類對(duì)子類是透明的,所以這種復(fù)用又稱為“白箱”復(fù)用。
- 子類與父類的耦合度高。父類的實(shí)現(xiàn)的任何改變都會(huì)導(dǎo)致子類的實(shí)現(xiàn)發(fā)生變化,這不利于類的擴(kuò)展與維護(hù)。
- 它限制了復(fù)用的靈活性。從父類繼承而來的實(shí)現(xiàn)是靜態(tài)的,在編譯時(shí)已經(jīng)定義,所以在運(yùn)行時(shí)不可能發(fā)生變化。
采用組合或聚合復(fù)用時(shí),可以將已有對(duì)象納入新對(duì)象中,使之成為新對(duì)象的一部分,新對(duì)象可以調(diào)用已有對(duì)象的功能,它有以下優(yōu)點(diǎn)。
- 它維持了類的封裝性。因?yàn)槌煞謱?duì)象的內(nèi)部細(xì)節(jié)是新對(duì)象看不見的,所以這種復(fù)用又稱為“黑箱”復(fù)用。
- 新舊類之間的耦合度低。這種復(fù)用所需的依賴較少,新對(duì)象存取成分對(duì)象的唯一方法是通過成分對(duì)象的接口。
- 復(fù)用的靈活性高。這種復(fù)用可以在運(yùn)行時(shí)動(dòng)態(tài)進(jìn)行,新對(duì)象可以動(dòng)態(tài)地引用與成分對(duì)象類型相同的對(duì)象。
二、應(yīng)用實(shí)例
1、示例一
發(fā)現(xiàn)問題 :假如我有一個(gè)類為C,他和D類有同樣的方法update,Test2類難道也要繼承C嗎?
public class Test2 extends D {
public void add() {
update();
}
}
class D {
public void update() {
}
}2、示例二
去除繼承關(guān)系,抽出來一個(gè)接口A,將A接口和Test1作為聚合關(guān)系,有必要的話也可以改為組合關(guān)系。這樣一來代碼耦合度就降低了,同時(shí)代碼也變得不是那么死板了。
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設(shè)計(jì)模式中的設(shè)計(jì)原則之合成復(fù)用原則詳解的文章就介紹到這了,更多相關(guān)Java合成復(fù)用原則內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java事務(wù)失效八大場(chǎng)景詳細(xì)解析
在Java開發(fā)中Spring框架提供了強(qiáng)大的事務(wù)管理功能,然而在實(shí)際開發(fā)過程中,由于對(duì)框架特性的誤解或不當(dāng)使用,可能導(dǎo)致事務(wù)失效問題,這篇文章主要介紹了Java事務(wù)失效八大場(chǎng)景的相關(guān)資料,需要的朋友可以參考下2025-10-10
Java實(shí)現(xiàn)XML與JSON秒級(jí)轉(zhuǎn)換示例詳解
這篇文章主要為大家介紹了Java實(shí)現(xiàn)XML與JSON秒級(jí)轉(zhuǎn)換示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
深入理解JavaWeb中過濾器與監(jiān)聽器的應(yīng)用
這篇文章主要介紹了JavaWeb中過濾器與監(jiān)聽器的應(yīng)用,過濾器能夠?qū)ζヅ涞恼?qǐng)求到達(dá)目標(biāo)之前或返回響應(yīng)之后增加一些處理代碼,監(jiān)聽器是一個(gè)接口內(nèi)容由我們實(shí)現(xiàn),會(huì)在特定時(shí)間被調(diào)用,感興趣想要詳細(xì)了解可以參考下文2023-05-05
JVM(Java?Virtual?Machine,Java虛擬機(jī))的作用詳解
JVM是Java語言實(shí)現(xiàn)“一次編寫,到處運(yùn)行”特性的基石,也是Java平臺(tái)的核心組成部分,其主要作用包括平臺(tái)無關(guān)性、內(nèi)存管理、運(yùn)行Java程序、安全性以及性能優(yōu)化,通過這些功能,JVM確保了Java程序的可移植性、高效性和安全性2025-03-03

