組合模式

組合模式

##定義 將對象組合成樹形結構表示總體-部分的層次結構,使得用戶對每一個單個對象和組合對象的使用具備一致性bash

##使用場景 表示對象的部分-總體層次結構時 從一個總體中可以獨立出部分模塊或功能的場景markdown

##模式結構ide

  • Component 抽象根節點,爲組合中的對象聲明接口
  • Composite 定義有子節點的那些枝幹節點的行爲,存儲子節點,在 Component 接口中實現與子節點有關的操做
  • Leaf 在組合中表示葉子節點對象,葉子節點沒有子節點,在組合中定義節點對象的行爲
  • Client 經過 Component 接口操縱組合節點的對象

##簡單實現 操做系統的文件系統就是一種典型的組合模式例子,Android中View與ViewGroup構成的UI體系也是很典型的實現。 下面以一個簡單的文件系統來作說明this

public abstract class Dir {

    /**
     * 聲明一個 list 成員變量存儲文件夾下的全部元素
     */
    protected List<Dir> dirs = new ArrayList<>();

    private String name;

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

    /**
     * 添加一個文件或文件夾
     *
     * @param dir 文件或文件夾
     */
    public abstract void addDir(Dir dir);

    /**
     * 刪除一個文件或文件夾
     *
     * @param dir 文件或文件夾
     */
    public abstract void rmDir(Dir dir);

    /**
     * 清空文件夾下全部元素
     */
    public abstract void clear();

    /**
     * 輸出文件夾目錄結構
     */
    public abstract void print();

    /**
     * 獲取文件夾下全部文件或子文件夾
     *
     * @return 文件夾下全部文件或子文件夾
     */
    public abstract List<Dir> getFiles();


    /**
     * 獲取文件或文件夾名
     *
     * @return 文件或文件夾名
     */
    public String getName() {
        return name;
    }
}

複製代碼
public class File extends Dir {
    public File(String name) {
        super(name);
    }

    @Override
    public void addDir(Dir dir) {
        throw new UnsupportedOperationException("文件對象不支持該操做");
    }

    @Override
    public void rmDir(Dir dir) {
        throw new UnsupportedOperationException("文件對象不支持該操做");
    }

    @Override
    public void clear() {
        throw new UnsupportedOperationException("文件對象不支持該操做");
    }

    @Override
    public void print() {
        System.out.print(getName());
    }

    @Override
    public List<Dir> getFiles() {
        throw new UnsupportedOperationException("文件對象不支持該操做");
    }
}

複製代碼

文件爲葉子節點,不能做爲文件夾來使用,它相對於文件夾來講既不支持添加也不支持刪除,這裏直接拋出一個不支持異常來簡單處理。spa

public class Folder extends Dir {
    public Folder(String name) {
        super(name);
    }

    @Override
    public void addDir(Dir dir) {
        dirs.add(dir);
    }

    @Override
    public void rmDir(Dir dir) {
        dirs.remove(dir);
    }

    @Override
    public void clear() {
        dirs.clear();
    }

    @Override
    public void print() {
        System.out.print(getName() + " (");

        Iterator<Dir> iterator = dirs.iterator();
        while (iterator.hasNext()) {
            Dir dir = iterator.next();
            dir.print();
            if (iterator.hasNext()) {
                System.out.print(", ");
            }
        }
        System.out.print(") ");
    }

    @Override
    public List<Dir> getFiles() {
        return dirs;
    }
}

複製代碼
public class Client {

    public static void main(String[] args) {

        Dir disk = new Folder("木葉");
        File file = new File("火影");
        disk.addDir(file);

        Dir high = new Folder("上忍");
        disk.addDir(high);

        Dir low = new Folder("下忍");
        disk.addDir(low);

        Dir elite = new Folder("精英上忍");
        high.addDir(elite);
        elite.addDir(new File("卡卡西 "));

        Dir general = new Folder("普通上忍");
        high.addDir(general);
        general.addDir(new File("寧次"));

        low.addDir(new File("鳴人"));
        low.addDir(new File("佐助"));


        disk.print();


        System.out.println("\n---------------------\n");

        disk.rmDir(file);

        disk.print();

    }
}

複製代碼

輸出結果:操作系統

木葉 (火影, 上忍 (精英上忍 (卡卡西 ) , 普通上忍 (寧次) ) , 下忍 (鳴人, 佐助) ) 
---------------------

木葉 (上忍 (精英上忍 (卡卡西 ) , 普通上忍 (寧次) ) , 下忍 (鳴人, 佐助) ) 
Process finished with exit code 0

複製代碼
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息