天天看點

設計模式--組合模式

類圖

設計模式--組合模式

源碼

package composite;

public interface IFile {
    //下面兩個方法,相當于類圖中operation方法
    void delete();
    String getName();
    
    /* 以上為公共行為,以下為檔案夾才有的行為 */
    
    //建立新檔案,相當于add方法
    void createNewFile(String name);
    //相當于remove方法
    void deleteFile(String name);
    //相當于GetChild方法
    IFile getIFile(int index);
}

Folder.java
package composite;


import java.util.ArrayList;
import java.util.List;

public class Folder implements IFile{
    
    private String name;
    private IFile folder;
    private List<IFile> files;
    
    public Folder(String name) {
        this(name, null);
    }

    public Folder(String name,IFile folder) {
        super();
        this.name = name;
        this.folder = folder;
        files = new ArrayList<IFile>();
    }
    
    public String getName() {
        return name;
    }
    
    //與File的删除方法不同,先删除下面的檔案以及檔案夾後再删除自己
    public void delete() {
        List<IFile> copy = new ArrayList<IFile>(files);
        System.out.println("------------删除子檔案-------------");
        for (IFile file : copy) {
            file.delete();
        }
        System.out.println("----------删除子檔案結束-------------");
        if (folder != null) {
            folder.deleteFile(name);
        }
        System.out.println("---删除[" + name + "]---");
    }

    public void createNewFile(String name) {
        if (name.contains(".")) {
            files.add(new File(name,this));
        }else {
            files.add(new Folder(name,this));
        }
    }

    public void deleteFile(String name) {
        for (IFile file : files) {
            if (file.getName().equals(name)) {
                files.remove(file);
                break;
            }
        }
    }

    public IFile getIFile(int index) {
        return files.get(index);
    }

}

File.java
package composite;

public class File implements IFile{
    
    private String name;
    private IFile folder;
    
    public File(String name,IFile folder) {
        super();
        this.name = name;
        this.folder = folder;
    }
    
    public String getName() {
        return name;
    }

    public void delete() {
        folder.deleteFile(name);
        System.out.println("---删除[" + name + "]---");
    }

    //檔案不支援建立新檔案
    public void createNewFile(String name) {
        throw new UnsupportedOperationException();
    }
    //檔案不支援删除檔案
    public void deleteFile(String name) {
        throw new UnsupportedOperationException();
    }
    //檔案不支援擷取下面的檔案清單
    public IFile getIFile(int index) {
        throw new UnsupportedOperationException();
    }

}

Client.java
package composite;

public class Client {
    public static void main(String[] args) {
        IFile root = new Folder("我的電腦");
        root.createNewFile("C槽");
        root.createNewFile("D盤");
        root.createNewFile("E盤");
        IFile D = root.getIFile(1);
        D.createNewFile("project");
        D.createNewFile("電影");
        IFile project = D.getIFile(0);
        project.createNewFile("test1.java");
        project.createNewFile("test2.java");
        project.createNewFile("test3.java");
        IFile movie = D.getIFile(1);
        movie.createNewFile("電影1.avi");
        movie.createNewFile("電影2.avi");
        
        /* 以上為目前檔案系統的情況,下面我們嘗試删除檔案和檔案夾 */
        display(null, root);
        System.out.println();
        
        project.delete();
        movie.getIFile(1).delete();
        
        System.out.println();
        display(null, root);
    }
    
    //列印檔案系統
    public static void display(String prefix,IFile iFile){
        if (prefix == null) {
            prefix = "";
        }
        System.out.println(prefix + iFile.getName());
        if(iFile instanceof Folder){
            for (int i = 0; ; i++) {
                try {
                    if (iFile.getIFile(i) != null) {
                        display(prefix + "--", iFile.getIFile(i));
                    }
                } catch (Exception e) {
                    break;
                }
            }
        }
    }

}      

測試截圖

設計模式--組合模式