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