组合模式

128 阅读1分钟

背景

组合模式,又称为 Composite 模式,在计算机的文件系统中,一个文件夹可以放入文件和文件夹(子文件夹),而子文件夹又可以放入新的文件和文件夹。可以说,文件夹是形成了一种容器结构,递归结构。而 Composite 就是创建出这种结构的模式,能够使容器与内容具有一致性,创造出递归结构的模式就是 Composite模式。

登场角色

Leaf 树叶

表示内容的角色,该角色不能放入其他对象

Composite 复合物

表示容器的角色,可以放入 Leaf 角色和 Composite 角色

Component

使Leaf 角色和Composite 角色具有一致性的角色,相当于实例代码中的Entry

Client

使用Composite模式的角色

类图

示例代码

实例模拟文件夹和文件的存储系统

Entry 类

该类是 File 类和 Directory 类的父类

public abstract class Entry {
    public abstract String getName();

    public abstract int getSize();  

    public void printList() {
        printList("");
    }

    public Entry add(Entry entry) {
        throw new FileTreatMentException();
    }

    public abstract void printList(String prefix);

    @Override
    public String toString() {
        return getName() + "(" + getSize() + ")";
    }
}

File 类

public class File extends Entry{

    private String name;

    private int size;

    public File(String name, int size) {
        this.name = name;
        this.size = size;
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public int getSize() {
        return size;
    }

    @Override
    public void printList(String prefix) {
        System.out.println(prefix + "/" + this);
    }
}

Directory 类

public class Directory extends Entry{

    private String name;

    private ArrayList<Entry> entries = new ArrayList<>();

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

    @Override
    public Entry add(Entry entry) {
        entries.add(entry);
        return this;
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public int getSize() {
        int size = 0;
        Iterator<Entry> iterator = entries.iterator();
        while (iterator.hasNext()) {
            Entry entry = iterator.next();
            size += entry.getSize();
        }
        return size;
    }

    @Override
    public void printList(String prefix) {
        System.out.println(prefix + "/" + this);
        Iterator<Entry> iterator = entries.iterator();
        while (iterator.hasNext()) {
            Entry entry = iterator.next();
            entry.printList(prefix + "/" + name);
        }
    }
}

FileTreatMentException类

自定义异常类

public class FileTreatMentException extends RuntimeException{

    public FileTreatMentException() {
    }

    public FileTreatMentException(String message) {
        super(message);
    }
}

功能分析

  1. 使用Composite 模式可以使容器与内容具有一致性,也可以称其为多个和单个的一致性,即将多个对象结合在一起,当作一个对象处理;