Java 设计模式

Java设计模式 - 组合模式

2017-11-22  本文已影响1人  a57ecf3aaaf2

定义

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

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

举例

看下面的代码,定义一个 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_原创,未经许可,不得转载!

上一篇 下一篇

猜你喜欢

热点阅读