定义

组合多个对象用来表示具有"整体-部分"关系的层次结构。它是一种对象结构型模式。

目录与文件具有整体-部分层次关系
所以目录与文件可以利用组合模式。


UML示例

组合模式

代码示例

抽象构件

// 抽象构件
abstract class AbstractFile {
    protected String name;

    public abstract void add(AbstractFile file);
    public abstract void remove(AbstractFile file);
    public abstract AbstractFile getChild(int i);
    public abstract void killVirus();
}

叶子构件1

// 图像文件类:叶子构件
public class ImageFile extends AbstractFile {

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

    public void add(AbstractFile file) {
        System.out.println("不支持");
    }

    public void remove(AbstractFile file) {
        System.out.println("不支持");
    }

    public AbstractFile getChild(int i) {
        System.out.println("不支持");
        return null;
    }

    public void killVirus() {
        System.out.println("对图像文件 <" + name + "> 进行杀毒");
    }
}

叶子构件2

// 文本文件类:叶子构件
public class TextFile extends AbstractFile{

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

    public void add(AbstractFile file) {
        System.out.println("不支持");

    }

    public void remove(AbstractFile file) {
        System.out.println("不支持");

    }

    public AbstractFile getChild(int i) {
        System.out.println("不支持");
        return null;
    }

    public void killVirus() {
        System.out.println("对文本文件 <" + name + "> 进行杀毒");

    }
}

容器构件

// 文件夹类:容器构件
public class Folder extends AbstractFile {

    // 定义集合fileList 储存AbstractFile 类成员
    private ArrayList<AbstractFile> fileList = new ArrayList<AbstractFile>();

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

    public void add(AbstractFile file) {
        fileList.add(file);
    }

    public void remove(AbstractFile file) {
        fileList.remove(file);
    }

    public AbstractFile getChild(int i) {
        return fileList.get(i);
    }

    public void killVirus() {
        System.out.println("---对文件夹 <" + name + "> 进行杀毒----");
        for (AbstractFile obj : fileList) {
            obj.killVirus();
        }

    }
}

客户端

public class Client {
    public static void main(String[] args) {
        AbstractFile file1, file2, file3, file4, file5, folder1,
                folder2, folder3;

        folder1 = new Folder("Sunny的资料");
        folder2 = new Folder("图像资料");
        folder3 = new Folder("文本文件");

        file1 = new ImageFile("小龙女.jpg");
        file2 = new ImageFile("张无忌.gif");
        file3 = new TextFile("杂乱的资料.txt");
        file4 = new TextFile("葵花宝典.txt");
        file5 = new TextFile("笑傲江湖.txt");


        folder1.add(file3);
        folder2.add(file1);
        folder2.add(file2);
        folder3.add(file4);
        folder3.add(file5);
        folder1.add(folder2);
        folder1.add(folder3);

        folder1.killVirus();
    }

}
最后修改:2020 年 05 月 22 日
如果觉得我的文章对你有用,请随意赞赏