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