快速理解Java設(shè)計(jì)模式中的組合模式
組合模式是一種常見(jiàn)的設(shè)計(jì)模式(但我感覺(jué)有點(diǎn)復(fù)雜)也叫合成模式,有時(shí)又叫做部分-整體模式,主要是用來(lái)描述部分與整體的關(guān)系。
個(gè)人理解:組合模式就是將部分組裝成整體。
定義如下:
將對(duì)象組合成樹形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu),使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。
通用類圖如下:

組合模式的包含角色:
● Component 抽象構(gòu)件角色
定義參加組合對(duì)象的共有方法和屬性,可以定義一些默認(rèn)的行為或?qū)傩浴?/p>
● Leaf 葉子構(gòu)件
葉子對(duì)象,其下再也沒(méi)有其他的分支,也就是遍歷的最小單位。
● Composite 樹枝構(gòu)件
樹枝對(duì)象,它的作用是組合樹枝節(jié)點(diǎn)和葉子節(jié)點(diǎn)形成一個(gè)樹形結(jié)構(gòu)。
通用源代碼:
抽象構(gòu)件
public abstract class Component {
//個(gè)體和整體都具有的共享
public void do Something(){
//編寫業(yè)務(wù)邏輯
}
}
樹枝構(gòu)建
public class Composite extends Component {
//構(gòu)件容器
private Array List<component> component Array List = new Array List<component>()
//增加一個(gè)葉子構(gòu)件或樹枝構(gòu)件
public void add(Component component){
this.component Array List.add(component);
}
//刪除一個(gè)葉子構(gòu)件或樹枝構(gòu)件
public void remove(Component component){
this.component Array List.remove(component);
}
//獲得分支下的所有葉子構(gòu)件和樹枝構(gòu)件
public Array List<component> get Children(){
return this.component Array List;
}
}
樹葉節(jié)點(diǎn)是沒(méi)有子下級(jí)對(duì)象的對(duì)象,定義參加組合的原始對(duì)象行為。
樹葉構(gòu)件
public class Leaf extends Component {
/*
*
可以覆寫父類方法
* public void do Something(){
*
* }
*/
}
測(cè)試類負(fù)責(zé)樹狀結(jié)構(gòu)的建立,并可以通過(guò)遞歸方式遍歷整個(gè)樹。
public class Client {
public static void main(String[] args) {
//創(chuàng)建一個(gè)根節(jié)點(diǎn)
Composite root = new Composite();
root.do Something();
//創(chuàng)建一個(gè)樹枝構(gòu)件
Composite branch = new Composite();
//創(chuàng)建一個(gè)葉子節(jié)點(diǎn)
Leaf leaf = new Leaf();
//建立整體
root.add(branch);
branch.add(leaf);
}
//通過(guò)遞歸遍歷樹
public static void display(Composite root){
for(Component c:root.get Children()){
if(c instanceof Leaf){ //葉子節(jié)點(diǎn)
c.do Something();
}else{ //樹枝節(jié)點(diǎn)
display((Composite)c);
}
}
}
}
組合模式的優(yōu)點(diǎn):
● 高層模塊調(diào)用簡(jiǎn)單
一棵樹形機(jī)構(gòu)中的所有節(jié)點(diǎn)都是Component,局部和整體對(duì)調(diào)用者來(lái)說(shuō)沒(méi)有任何區(qū)別,也就是說(shuō),高層模塊不必關(guān)心自己處理的是單個(gè)對(duì)象還是整個(gè)組合結(jié)構(gòu),簡(jiǎn)化了高層模塊的代碼。
● 節(jié)點(diǎn)自由增加
使用了組合模式后,我們可以看看,如果想增加一個(gè)樹枝節(jié)點(diǎn)、樹葉節(jié)點(diǎn)是不是都很容易,只要找到它的父節(jié)點(diǎn)就成,非常容易擴(kuò)展,符合開閉原則,對(duì)以后的維護(hù)非常有利。
組合模式的缺點(diǎn):
組合模式有一個(gè)非常明顯的缺點(diǎn),看到我們?cè)趫?chǎng)景類中的定義,提到樹葉和樹枝使用時(shí)的定義了嗎?直接使用了實(shí)現(xiàn)類!這在面向接口編程上是很不恰當(dāng)?shù)?,與依賴倒置原則沖突,讀者在使用的時(shí)候要考慮清楚,它限制了你接口的影響范圍。
使用場(chǎng)景:
● 維護(hù)和展示部分-整體關(guān)系的場(chǎng)景,如樹形菜單、文件和文件夾管理。
● 從一個(gè)整體中能夠獨(dú)立出部分模塊或功能的場(chǎng)景。
注意事項(xiàng):
只要是樹形結(jié)構(gòu),就要考慮使用組合模式,這個(gè)一定要記住,只要是要體現(xiàn)局部和整體的關(guān)系的時(shí)候,而且這種關(guān)系還可能比較深,考慮一下組合模式吧。
總結(jié)
以上就是本文關(guān)于快速理解Java設(shè)計(jì)模式中的組合模式的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:Java設(shè)計(jì)模式——工廠設(shè)計(jì)模式詳解、Java設(shè)計(jì)模式之訪問(wèn)者模式使用場(chǎng)景及代碼示例、Java設(shè)計(jì)模式筆記之抽象工廠代碼示例等,有什么問(wèn)題可以隨時(shí)留言,小編會(huì)及時(shí)回復(fù)大家的。感謝朋友們對(duì)本站的支持!
相關(guān)文章
java連接orcale數(shù)據(jù)庫(kù)示例分享
這篇文章主要介紹了java連接orcale數(shù)據(jù)庫(kù)示例,需要的朋友可以參考下2014-02-02
SpringBoot使用AOP與注解實(shí)現(xiàn)請(qǐng)求參數(shù)自動(dòng)填充流程詳解
面向切面編程(aspect-oriented programming,AOP)主要實(shí)現(xiàn)的目的是針對(duì)業(yè)務(wù)處理過(guò)程中的切面進(jìn)行提取,諸如日志、事務(wù)管理和安全這樣的系統(tǒng)服務(wù),從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低,提高程序的可重用性,同時(shí)提高了開發(fā)的效率2023-02-02
java compare compareTo方法區(qū)別詳解
本文主要介紹了java compare compareTo方法區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
Java如何實(shí)現(xiàn)遠(yuǎn)程文件下載到本地目錄
本文介紹了如何使用Java來(lái)實(shí)現(xiàn)遠(yuǎn)程文件的下載功能,主要通過(guò)HTTPS路徑下載文件到本地目錄,詳細(xì)介紹了相關(guān)代碼和測(cè)試步驟,并提供了實(shí)際案例供參考,本文旨在幫助需要實(shí)現(xiàn)文件下載功能的開發(fā)者快速掌握核心技術(shù)2024-10-10
Springboot Thymeleaf模板文件調(diào)用Java類靜態(tài)方法
這篇文章主要介紹了Springboot Thymeleaf模板文件調(diào)用Java類靜態(tài)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2007-09-09
深入了解Java語(yǔ)言中的并發(fā)性選項(xiàng)有何不同
這篇文章主要介紹了深入了解Java語(yǔ)言中的并發(fā)性選項(xiàng)有何不同,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下2019-06-06
Java?swing創(chuàng)建一個(gè)窗口的簡(jiǎn)單步驟
這篇文章主要給大家介紹了關(guān)于Java?swing創(chuàng)建一個(gè)窗口的簡(jiǎn)單步驟,Java Swing是Java平臺(tái)下的GUI(Graphical User Interface,圖形用戶界面)工具包,提供了豐富的GUI組件,可以實(shí)現(xiàn)復(fù)雜的圖形界面應(yīng)用程序,需要的朋友可以參考下2024-06-06

