天天看點

Java組合模式(Composite)

組合模式(Composite)

使用組合模式的場景:

 把部分和整體的關系用樹形結構來表示,進而使用戶端可以使用統一的方式處理部分對象和整體對象.

組合模式核心:

   抽象構件(Component)角色: 定義了葉子和容器構件的共同點

   葉子(Leaf)構件角色:無子節點

   容器(Composite)構件角色: 有容器特征,可以包含子節點

結構類圖

Java組合模式(Composite)

組合模式工作流程分析:

   組合模式為處理樹形結構提供了完美的解決方案,描述了如何将容器和葉子進行遞歸組合,使得使用者在使用時可以一緻性的對待容器和葉子。

   當容器對象的指定方法被調用時,将周遊整個樹形結構,尋找也包含這個方法的成員,并調用執行。其中,使用了遞歸調用的機制對整個結構進行處理。

檔案管理案例

Component抽象

/**
 * 抽象建構
 * @author 波波烤鴨
 * @email [email protected]
 *
 */
public interface AbstractFile {
    /**
     * 定義操作的方法
     */
    void operiation();
}      

Leaf節點

public class ImageFile implements AbstractFile{
    
    private String name;
    
    public ImageFile(String name) {
        super();
        this.name = name;
    }
    
    @Override
    public void operiation() {
        System.out.println("圖檔檔案:"+name+" 處理操作");
    }
}      
public class TextFile implements AbstractFile{
    
    private String name;
    
    public TextFile(String name) {
        super();
        this.name = name;
    }
    
    @Override
    public void operiation() {
        System.out.println("文本檔案:"+name+" 處理操作");
    }
}      
public class VideoFile implements AbstractFile{
    
    private String name;
    
    public VideoFile(String name) {
        super();
        this.name = name;
    }
    
    @Override
    public void operiation() {
        System.out.println("視訊檔案:"+name+" 處理操作");
    }
}      

Composite容器

/**
 * Composite容器元件
 * @author 波波烤鴨
 * @email [email protected]
 *
 */
public class Folder implements AbstractFile{
    
    private String name;
    // 定義容器,用來存儲葉子節點  也就是存儲檔案
    private List<AbstractFile> list = new ArrayList<>();
    
    public Folder(String name) {
        super();
        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);
    }

    @Override
    public void operiation() {
        System.out.println("處理:"+name+"檔案夾");
        for (AbstractFile file : list) {
            file.operiation();
        }
    }
}      

測試

public static void main(String[] args) {
    AbstractFile textFile,imageFile,videoFile;
    textFile = new TextFile("readme.txt");
    imageFile = new ImageFile("波波烤鴨.jpg");
    videoFile = new VideoFile("aaa.mp4");
    Folder f = new Folder("c:/tools");
    f.add(videoFile);
    f.add(imageFile);
    f.add(textFile);
    
    
    Folder f1 = new Folder("c:/");
    f1.add(videoFile);
    f1.add(videoFile);
    f1.add(imageFile);
    f1.add(f);
    
    f1.operiation();
}      

輸出:

處理:c:/檔案夾
視訊檔案:aaa.mp4 處理操作
視訊檔案:aaa.mp4 處理操作
圖檔檔案:波波烤鴨.jpg 處理操作
處理:c:/tools檔案夾
視訊檔案:aaa.mp4 處理操作
圖檔檔案:波波烤鴨.jpg 處理操作
文本檔案:readme.txt 處理操作      

開發中的應用場景:

   作業系統的資料總管

   GUI中的容器層次圖

   XML檔案解析

   OA系統中,組織結構的處理

   Junit單元測試架構

   • 底層設計就是典型的組合模式,TestCase(葉子)、TestUnite(容器)、Test接口(抽象)

Java組合模式(Composite)