美文网首页
Android设计模式之组合模式

Android设计模式之组合模式

作者: TangBuzhi | 来源:发表于2017-10-18 14:51 被阅读0次

    组合模式

    1.定义:

    将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。

    2.使用场景:

    • 表示对象的部分-整体层次结构时;
    • 从一个整体中能到独立出部分模块或功能的场景。

    3.UML图

    4.详解:

    组合模式也称为部分-整体模式(Part-Whole Pattern),属于结构型设计模式。
    下面以文件系统举例,即有的文件夹里面有文件夹或文件,有的没有。详见代码:

    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;
            }
        }
    

    上面定义了一个目录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");
            }
        }
    

    测试代码:

    public static void main(String[] args) {
            Folder cDisk = new Folder("C");//模拟创建C盘
            cDisk.addDir(new File("ImbaMallLog.txt"));//C盘下有该ImbaMallLog.txt文件
    
            Folder user = new Folder("user");//C盘下有该user文件夹
            Folder admin = new Folder("admin");//创建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))
             */
        }
    

    输出结果层级分明,首先是C盘,然后下面各种文件与文件夹,文件夹下还有子文件,与现实生活中的C盘几乎一样,该段代码模拟了C盘的部分-整体,这就是组合模式的生活举例。

    5.代码托管地址

    组合模式

    相关文章

      网友评论

          本文标题:Android设计模式之组合模式

          本文链接:https://www.haomeiwen.com/subject/kcoduxtx.html