美文网首页Java 设计模式
Java设计模式 - 组合模式

Java设计模式 - 组合模式

作者: a57ecf3aaaf2 | 来源:发表于2017-11-22 20:51 被阅读1次

    定义

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

    说到组合模式,大家应该会想到“树形结构”、“层次结构”、“物以类聚”、“整体与部分”等字眼,的确,组合模式就是将一些具有一致性的对象组合起来,便于管理。

    举例

    看下面的代码,定义一个 File 基类:

    public interface File {
        boolean isDirectory();
    }
    

    然后定义一个 Directory 子类:

    public class Directory implements File {
    
        private String name;
        private Set<File> files = new HashSet<>();
    
        public Directory(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        @Override
        public boolean isDirectory() {
            return true;
        }
    
        public void add(File file) {
            files.add(file);
    
        }
    
        public void remove(File file) {
            files.remove(file);
        }
    
        public Set<File> getFiles() {
            return files;
        }
    }
    

    Directory 具有容器的功能,所以添加了 add 、remove 等方法。

    下面来看一个具体的 PdfFile 的实现过程:

    public class PdfFile implements File {
    
        private String name;
    
        public PdfFile(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        @Override
        public boolean isDirectory() {
            return false;
        }
    }
    

    下面是客户类:

    public class Client {
        public static void main(String[] args) {
            Directory root = new Directory("root");
    
            File f = new PdfFile("Design Pattern on JAVA");
            File f1 = new PdfFile("开发文档");
            File f2 = new PdfFile("设计模式");
    
            Directory d = new Directory("document");
    
            root.add(f);
            root.add(d);
    
            d.add(f1);
            d.add(f2);
    
            print(root.getName(), 1);
            iterate(root, 2);
        }
    
        public static void iterate(Directory d, int i) {
            for (File f : d.getFiles()) {
                if (f.isDirectory() && f instanceof Directory) {
                    print(((Directory) f).getName(), i);
                    int j = i + 1;
                    iterate((Directory) f, j);
                } else {
                    print(f instanceof PdfFile ? ((PdfFile) f).getName() : "", i);
                }
            }
        }
    
        public static void print(String s, int i) {
            for (int j = 0; j < i; j++) {
                System.out.print("  ");
            }
            System.out.println(s);
        }
    }
    

    以上就是一个简单的组合模式的实现,print 之后就是一个具有层次结构的模型。

    Android 中的组合模式

    View、ViewGroup 之间的关系就是组合模式的具体表现。

    本文由Fynn_原创,未经许可,不得转载!

    相关文章

      网友评论

        本文标题:Java设计模式 - 组合模式

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