Java设计模式之结构型:组合模式
前言:
????????我們對于上面兩幅圖片肯定非常熟悉,這兩幅圖片我們都可以看做是一個文件結(jié)構(gòu),對于這樣的結(jié)構(gòu)我們稱之為樹形結(jié)構(gòu)。在數(shù)據(jù)結(jié)構(gòu)中我們知道可以通過調(diào)用某個方法來遍歷整個樹,當(dāng)我們找到某個葉子節(jié)點后,就可以對葉子節(jié)點進(jìn)行相關(guān)的操作。我們可以將這顆樹理解成一個大的容器,容器里面包含很多的成員對象,這些成員對象即可是容器對象也可以是葉子對象。但是由于容器對象和葉子對象在功能上面的區(qū)別,使得我們在使用的過程中必須要區(qū)分容器對象和葉子對象,但是這樣就會給客戶帶來不必要的麻煩,作為客戶而已,它始終希望能夠一致的對待容器對象和葉子對象。這就是組合模式的設(shè)計動機。
一、什么是組合模式:
????????組合模式將葉子對象和容器對象進(jìn)行遞歸組合,形成樹形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu),使得用戶對單個對象和組合對象的使用具有一致性,能夠像處理葉子對象一樣來處理組合對象,無需進(jìn)行區(qū)分,從而使用戶程序能夠與復(fù)雜元素的內(nèi)部結(jié)構(gòu)進(jìn)行解耦。
????????組合模式最關(guān)鍵的地方是葉子對象和組合對象實現(xiàn)了相同的抽象構(gòu)建類,它既可表示葉子對象,也可表示容器對象,客戶僅僅需要針對這個抽象構(gòu)建類進(jìn)行編程,這就是組合模式能夠?qū)⑷~子節(jié)點和對象節(jié)點進(jìn)行一致處理的原因。
? ? ? ? 通過組合模式,可以清晰地定義復(fù)雜對象的層次結(jié)構(gòu),葉子對象可以被組合成更復(fù)雜的容器對象,而容器對象又可以被組合,這樣不斷遞歸從而形成復(fù)雜的樹形結(jié)構(gòu);同時在組合模式中加入新的對象構(gòu)建也更容易,客戶端不必因為加入了新的對象構(gòu)件而更改原有代碼。
? ? ? ? 文章最前面的圖展示了計算機的文件系統(tǒng),文件系統(tǒng)由文件和目錄組成,目錄下面也可以包含文件或者目錄,計算機的文件系統(tǒng)是用遞歸結(jié)構(gòu)來進(jìn)行組織的,對于這樣的數(shù)據(jù)結(jié)構(gòu)是非常適用使用組合模式的。
二、UML結(jié)構(gòu)圖:
組合模式主要包含如下幾個角色:
- Component :抽象構(gòu)建類,組合中的對象聲明接口,在適當(dāng)?shù)那闆r下,實現(xiàn)所有類共有接口的默認(rèn)行為。聲明一個接口用于訪問和管理Component子部件。?
- Leaf:葉子對象。葉子結(jié)點沒有子結(jié)點。?
- Composite:容器對象,定義有枝節(jié)點行為,用來存儲子部件,在Component接口中實現(xiàn)與子部件有關(guān)操作,如增加(add)和刪除(remove)等。
從模式結(jié)構(gòu)中我們看出了葉子節(jié)點和容器對象都實現(xiàn)Component接口,這也是能夠?qū)⑷~子對象和容器對象一致對待的關(guān)鍵所在。
三、代碼實現(xiàn):
????????在文件系統(tǒng)中,可能存在很多種格式的文件,如果圖片,文本文件、視頻文件等等,這些不同的格式文件的瀏覽方式都不同,同時對文件夾的瀏覽就是對文件夾中文件的瀏覽,但是對于客戶而言都是瀏覽文件,兩者之間不存在什么差別,現(xiàn)在只用組合模式來模擬瀏覽文件。UML結(jié)構(gòu)圖:
首先是文件類:File.java
public abstract class File {String name;public File(String name){this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}public abstract void display(); }然后是文件夾類:Folder.java,該類包含對文件的增加、刪除和瀏覽三個方法
public class Folder extends File{private List<File> files;public Folder(String name){super(name);files = new ArrayList<File>();}/*** 瀏覽文件夾中的文件*/public void display() {for(File file : files){file.display();}}/*** @desc 向文件夾中添加文件* @param file* @return void*/public void add(File file){files.add(file);}/*** @desc 從文件夾中刪除文件* @param file* @return void*/public void remove(File file){files.remove(file);} }然后是三個文件類:TextFile.java、ImageFile.java、VideoFile.java
public class TextFile extends File{public TextFile(String name) {super(name);}public void display() {System.out.println("這是文本文件,文件名:" + super.getName());} }public class ImagerFile extends File{public ImagerFile(String name) {super(name);}public void display() {System.out.println("這是圖像文件,文件名:" + super.getName());} }public class VideoFile extends File{public VideoFile(String name) {super(name);}public void display() {System.out.println("這是影像文件,文件名:" + super.getName());} }最后是客戶端:
public class Client {public static void main(String[] args) {/*** 我們先建立一個這樣的文件系統(tǒng)* 總文件* * a.txt b.jpg c文件夾 * c_1.text c_1.rmvb c_1.jpg */ //總文件夾Folder zwjj = new Folder("總文件夾");//向總文件夾中放入三個文件:1.txt、2.jpg、1文件夾TextFile aText= new TextFile("a.txt");ImagerFile bImager = new ImagerFile("b.jpg");Folder cFolder = new Folder("C文件夾");zwjj.add(aText);zwjj.add(bImager);zwjj.add(cFolder);//向C文件夾中添加文件:c_1.txt、c_1.rmvb、c_1.jpg TextFile cText = new TextFile("c_1.txt");ImagerFile cImage = new ImagerFile("c_1.jpg");VideoFile cVideo = new VideoFile("c_1.rmvb");cFolder.add(cText);cFolder.add(cImage);cFolder.add(cVideo);//遍歷C文件夾cFolder.display();//將c_1.txt刪除cFolder.remove(cText);System.out.println("-----------------------");cFolder.display();} }運行結(jié)果:
設(shè)計模式系列文章:
Java設(shè)計模式之創(chuàng)建型:工廠模式詳解(簡單工廠+工廠方法+抽象工廠)
Java設(shè)計模式之創(chuàng)建型:建造者模式
Java設(shè)計模式之創(chuàng)建型:單例模式
Java設(shè)計模式之創(chuàng)建型:原型模式
Java設(shè)計模式之結(jié)構(gòu)型:適配器模式
Java設(shè)計模式之結(jié)構(gòu)型:裝飾器模式
Java設(shè)計模式之結(jié)構(gòu)型:代理模式
Java設(shè)計模式之結(jié)構(gòu)型:橋接模式
Java設(shè)計模式之結(jié)構(gòu)型:外觀模式
Java設(shè)計模式之結(jié)構(gòu)型:組合模式
Java設(shè)計模式之結(jié)構(gòu)型:享元模式
Java設(shè)計模式之行為型:策略模式
Java設(shè)計模式之行為型:模板方法模式
Java設(shè)計模式之行為型:責(zé)任鏈模式
Java設(shè)計模式之行為型:觀察者模式
Java設(shè)計模式之行為型:訪問者模式
Java設(shè)計模式之行為型:中介者模式
Java設(shè)計模式之行為型:命令模式
Java設(shè)計模式之行為型:狀態(tài)模式
Java設(shè)計模式之行為型:備忘錄模式
Java設(shè)計模式之行為型:迭代器模式
Java設(shè)計模式之行為型:解釋器模式
原博客鏈接:
設(shè)計模式讀書筆記-----組合模式_chenssy 的技術(shù)博客-CSDN博客
總結(jié)
以上是生活随笔為你收集整理的Java设计模式之结构型:组合模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java设计模式之结构型:外观模式
- 下一篇: Java设计模式之结构型:享元模式