Java設計模式學習08——組合模式

漢森X發表於2016-11-02

一、組合模式適用場景


把部分和整體的關係用樹形結構來表示,從而使客戶端可以使用統一的方式對部分物件和整體物件進行管理。

二、組合模式結構


  • 抽象構件(Conponent)角色:所有類的共有介面,定義了葉子和容器的共同點。
  • 葉子(Leaf)構件角色:在組合中表示葉子結點物件,葉子節點無子節點。
  • 容器(Composite)構件角色:有容器特徵,可以 用來儲存子節點,在Component介面中實現與子節點有關操作,如增加(add)和刪除 (remove)等。

這裡寫圖片描述

組合模式工作流程分析


  • 組合模式為處理樹形結構提供了完美的解決方案,描述瞭如何將容器和葉子進行遞迴組合,使得使用者在使用時可以一致性的對待容器和葉子。
  • 當容器物件的指定方法被呼叫時,將遍歷整個樹形結構,尋找包含這個方法的成員,並呼叫執行。其中,使用遞迴呼叫機制對整個結構進行處理。

下面通過簡單的防毒例子,使用組合模式:
示例程式碼:
1.抽象構件

public interface AbstractFile {
    void killVirus();//防毒
}

2. 葉子構件

class ImageFile implements AbstractFile{
    private String name;

    public ImageFile(String name){
        this.name=name;
    }

    public void killVirus() {
        System.out.println("---對影像檔案"+name+"防毒");

    }

}
class TextFile implements AbstractFile{
    private String name;

    public TextFile(String name){
        this.name=name;
    }

    public void killVirus() {
        System.out.println("---對文字檔案"+name+"防毒");

    }

}

3. 容器構件

class Folder implements AbstractFile{
    private String name;
    private ArrayList<AbstractFile> list=new ArrayList<AbstractFile>();
    public Folder(String name){
        this.name=name;
    }

    public void add(AbstractFile file){
        list.add(file);
    }
    public void remove(AbstractFile file){
        list.remove(file);
    }
    public AbstractFile getChild(int index){
        return list.get(index);
    }

    public void killVirus() {
        System.out.println("---對資料夾"+name+"防毒");
        for(AbstractFile file:list){
            file.killVirus();
        }

    }

}

4.客戶端

public class Client {

    public static void main(String[] args) {
        Folder f1;
        AbstractFile f2,f3;

        f1=new Folder("我的收藏");
        f2=new ImageFile("my.jpg");
        f3=new TextFile("my.txt");
        f1.add(f2);
        f1.add(f3);
        f1.killVirus();

    }

}

//輸出結果:
---對資料夾我的收藏防毒
---對影像檔案my.jpg防毒
---對文字檔案my.txt防毒  

相關文章