Java設(shè)計(jì)模式中組合模式應(yīng)用詳解
編程是一門藝術(shù),大批量的改動(dòng)顯然是非常丑陋的做法,用心的琢磨寫(xiě)的代碼讓它變的更美觀。
在現(xiàn)實(shí)生活中,存在很多“部分-整體”的關(guān)系,例如,大學(xué)中的部門與學(xué)院、總公司中的部門與分公司、學(xué)習(xí)用品中的書(shū)與書(shū)包等。
在軟件開(kāi)發(fā)中也是這樣,例如,文件系統(tǒng)中的文件與文件夾、窗體程序中的簡(jiǎn)單控件與容器控件等。對(duì)這些簡(jiǎn)單對(duì)象與復(fù)合對(duì)象的處理,如果用組合模式來(lái)實(shí)現(xiàn)會(huì)很方便。
1.組合設(shè)計(jì)模式定義
組合(Composite Pattern)設(shè)計(jì)模式的定義:有時(shí)又叫作整體-部分(Part-Whole)模式,它是一種將對(duì)象組合成樹(shù)狀的層次結(jié)構(gòu)的模式,用來(lái)表示“整體-部分”的關(guān)系,使用戶對(duì)單個(gè)對(duì)象和組合對(duì)象具有一致的訪問(wèn)性。
組合模式一般用來(lái)描述整體與部分的關(guān)系,它將對(duì)象組織到樹(shù)形結(jié)構(gòu)中,頂層的節(jié)點(diǎn)被稱為根節(jié)點(diǎn),根節(jié)點(diǎn)下面可以包含樹(shù)枝節(jié)點(diǎn)和葉子節(jié)點(diǎn),樹(shù)枝節(jié)點(diǎn)下面又可以包含樹(shù)枝節(jié)點(diǎn)和葉子節(jié)點(diǎn)。
2.組合設(shè)計(jì)模式的優(yōu)點(diǎn)與不足
組合模式的主要優(yōu)點(diǎn)有:
- 組合模式使得客戶端代碼可以一致地處理單個(gè)對(duì)象和組合對(duì)象,無(wú)須關(guān)心自己處理的是單個(gè)對(duì)象,還是組合對(duì)象,這簡(jiǎn)化了客戶端代碼;
- 更容易在組合體內(nèi)加入新的對(duì)象,客戶端不會(huì)因?yàn)榧尤肓诵碌膶?duì)象而更改源代碼,滿足“開(kāi)閉原則”;
其主要不足是:
- 設(shè)計(jì)較復(fù)雜,客戶端需要花更多時(shí)間理清類之間的層次關(guān)系;
- 不容易限制容器中的構(gòu)件;
- 不容易用繼承的方法來(lái)增加構(gòu)件的新功能;
3.組合模式的實(shí)現(xiàn)思路
組合模式包含以下主要角色:
- 抽象構(gòu)件(Component)角色:它的主要作用是為樹(shù)葉構(gòu)件和樹(shù)枝構(gòu)件聲明公共接口,并實(shí)現(xiàn)它們的默認(rèn)行為。在透明式的組合模式中抽象構(gòu)件還聲明訪問(wèn)和管理子類的接口;在安全式的組合模式中不聲明訪問(wèn)和管理子類的接口,管理工作由樹(shù)枝構(gòu)件完成。(總的抽象類或接口,定義一些通用的方法,比如新增、刪除)
- 樹(shù)葉構(gòu)件(Leaf)角色:是組合中的葉節(jié)點(diǎn)對(duì)象,它沒(méi)有子節(jié)點(diǎn),用于繼承或?qū)崿F(xiàn)抽象構(gòu)件。
- 樹(shù)枝構(gòu)件(Composite)角色 / 中間構(gòu)件:是組合中的分支節(jié)點(diǎn)對(duì)象,它有子節(jié)點(diǎn),用于繼承和實(shí)現(xiàn)抽象構(gòu)件。它的主要作用是存儲(chǔ)和管理子部件,通常包含 Add()、Remove()、GetChild() 等方法。
4.組合設(shè)計(jì)模式代碼示例
場(chǎng)景介紹:將地區(qū)區(qū)域分級(jí)表示,使用其他的方式很難將層次結(jié)構(gòu)表達(dá)清楚,使用組合設(shè)計(jì)模式就非常方便。
public abstract class Node {
private String name;
public Node(String name){
this.name = name;
}
/**
* 獲取子節(jié)點(diǎn)
* @return
*/
public abstract List<Node> getChildren();
public String getName() {
return name;
}
}
/**
* 葉子節(jié)點(diǎn)
*/
public class LeafNode extends Node{
public LeafNode(String name) {
super(name);
}
@Override
public List<Node> getChildren() {
return null;
}
}
/**
* 區(qū)節(jié)點(diǎn)
*/
public class DistrictNode extends Node{
private List<Node> children = new ArrayList<>();
public DistrictNode(String name) {
super(name);
}
@Override
public List<Node> getChildren() {
return children;
}
public void addChild(Node node){
children.add(node);
}
public void delChild(int i){
children.remove(i);
}
}
public static void main(String[] args) {
//根目錄
DistrictNode root = new DistrictNode("root");
//一線目錄
root.addChild(new DistrictNode("shang hai"));
root.addChild(new DistrictNode("tian jin"));
DistrictNode districtNode = new DistrictNode("bei jing");
root.addChild(districtNode);
//二級(jí)目錄
districtNode.addChild(new DistrictNode("hai dian qu"));
districtNode.addChild(new DistrictNode("xi cheng qu"));
DistrictNode districtNode2 = new DistrictNode("chao yang qu");
districtNode.addChild(districtNode2);
//三級(jí)目錄
districtNode2.addChild(new LeafNode("san li tun "));
districtNode2.addChild(new LeafNode("guo mao"));
System.out.println(JsonOutput.toJson(root));
}使用組合模式,很清晰的將分層的數(shù)據(jù)進(jìn)行組織,以后遇到類似這樣的數(shù)據(jù),可以采用這個(gè)方式處理。
5.組合設(shè)計(jì)模式應(yīng)用場(chǎng)景
前面分析了組合模式的結(jié)構(gòu)與特點(diǎn),下面分析它適用的以下應(yīng)用場(chǎng)景。
- 在需要表示一個(gè)對(duì)象整體與部分的層次結(jié)構(gòu)的場(chǎng)合。
- 要求對(duì)用戶隱藏組合對(duì)象與單個(gè)對(duì)象的不同,用戶可以用統(tǒng)一的接口使用組合結(jié)構(gòu)中的所有對(duì)象的場(chǎng)合。
到此這篇關(guān)于Java設(shè)計(jì)模式中組合模式應(yīng)用詳解的文章就介紹到這了,更多相關(guān)Java組合模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring?Initializr只能創(chuàng)建為Java?17版本以上的問(wèn)題解決
這篇文章主要給大家介紹了關(guān)于Spring?Initializr只能創(chuàng)建為Java?17版本以上問(wèn)題的解決辦法,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-01-01
linux配置java環(huán)境變量詳細(xì)過(guò)程
這篇文章主要介紹了linux配置java環(huán)境變量詳細(xì)過(guò)程,需要的朋友可以參考下2015-09-09
spring-boot整合dubbo:Spring-boot-dubbo-starter
這篇文章主要介紹了spring-boot整合dubbo:Spring-boot-dubbo-starter的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-05-05
java實(shí)現(xiàn)建造者模式(Builder Pattern)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)建造者模式Builder Pattern,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10
SpringBoot整合MyBatis實(shí)現(xiàn)CRUD操作項(xiàng)目實(shí)踐
本文主要介紹了SpringBoot整合MyBatis實(shí)現(xiàn)CRUD操作項(xiàng)目實(shí)踐,如何實(shí)現(xiàn)數(shù)據(jù)庫(kù)的CRUD創(chuàng)建、讀取、更新、刪除操作,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02

