Android設(shè)計(jì)模式之組合模式

組合模式

1.定義:

將對(duì)象組合成樹形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu),使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。

2.使用場(chǎng)景:

  • 表示對(duì)象的部分-整體層次結(jié)構(gòu)時(shí);
  • 從一個(gè)整體中能到獨(dú)立出部分模塊或功能的場(chǎng)景。

3.UML圖

4.詳解:

組合模式也稱為部分-整體模式(Part-Whole Pattern),屬于結(jié)構(gòu)型設(shè)計(jì)模式。
下面以文件系統(tǒng)舉例,即有的文件夾里面有文件夾或文件,有的沒有。詳見代碼:

public static abstract class Dir {
        protected List<Dir> dirs = new ArrayList<>();
        private String name;

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

        public abstract void addDir(Dir dir);

        public abstract void removeDir(Dir dir);

        public abstract void clear();

        public abstract void show();

        public abstract List<Dir> getDirs();

        public String getName() {
            return name;
        }
    }

上面定義了一個(gè)目錄Dir抽象類,里面有若干方法;
下面看具體的繼承類:文件夾(Folder)與文件(File):

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

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

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

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

        @Override
        public void show() {
            System.out.print(getName() + "(");
            Iterator<Dir> iterator = dirs.iterator();
            while (iterator.hasNext()) {
                Dir dir = iterator.next();
                dir.show();
                if (iterator.hasNext()) {
                    System.out.print(",");
                }
            }
            System.out.print(")");
        }

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

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

        @Override
        public void addDir(Dir dir) {
            throw new UnsupportedOperationException("File not support add dir");
        }

        @Override
        public void removeDir(Dir dir) {
            throw new UnsupportedOperationException("File not support remove dir");
        }

        @Override
        public void clear() {
            throw new UnsupportedOperationException("File not support clear dir");
        }

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

        @Override
        public List<Dir> getDirs() {
            throw new UnsupportedOperationException("File not support get dir");
        }
    }

測(cè)試代碼:

public static void main(String[] args) {
        Folder cDisk = new Folder("C");//模擬創(chuàng)建C盤
        cDisk.addDir(new File("ImbaMallLog.txt"));//C盤下有該ImbaMallLog.txt文件

        Folder user = new Folder("user");//C盤下有該user文件夾
        Folder admin = new Folder("admin");//創(chuàng)建adimin文件夾
        admin.addDir(new File("download"));//adimin下有該download文件
        user.addDir(admin);//user下有該admin文件夾
        user.addDir(new Folder("public"));//user下有該public文件夾
        cDisk.addDir(user);//C盤下有user文件夾

        Folder windows = new Folder("Windows");
        windows.addDir(new File("windows.dll"));
        cDisk.addDir(windows);

        Folder program_file = new Folder("Program Files");
        program_file.addDir(new File("mail"));
        cDisk.addDir(program_file);

        Folder prefer_log = new Folder("PrefLogs");
        prefer_log.addDir(new File("log.txt"));
        cDisk.addDir(prefer_log);

        cDisk.show();
        /**
         C(ImbaMallLog.txt,user(admin(download),public()),Windows(windows.dll),Program Files(mail),PrefLogs(log.txt))
         */
    }

輸出結(jié)果層級(jí)分明,首先是C盤,然后下面各種文件與文件夾,文件夾下還有子文件,與現(xiàn)實(shí)生活中的C盤幾乎一樣,該段代碼模擬了C盤的部分-整體,這就是組合模式的生活舉例。

5.代碼托管地址

組合模式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容