2024/11/06

软件设计 实验10:组合模式

用透明组合模式实现教材中的“文件夹浏览”这个例子。

类图

 

public abstract class AbstractFile {
    public abstract void add(AbstractFile element);
    public abstract void remove(AbstractFile element);
    public abstract void display(int depth);
}

 

public class Folder extends AbstractFile{
    private ArrayList<AbstractFile> fileList = new ArrayList<>();
    private String fileName;

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

    @Override
    public void add(AbstractFile element) {

        fileList.add(element);
        // 获取类的简单名称
       
String elementName = element.getClass().getSimpleName();
        //输出提示信息
       
System.out.println(fileName + "添加了一个" + elementName);
    }

    @Override
    public void remove(AbstractFile element) {

        fileList.remove(element);
        // 获取类的简单名称
       
String elementName = element.getClass().getSimpleName();
        //输出提示信息
       
System.out.println(fileName + "删除了一个" + elementName);
    }

    @Override
    public void display(int depth) {
        // 根据深度打印缩进
       
for (int i = 0; i < depth; i++) {
            System.out.print("  "); // Indentation
       
}
        System.out.println("+" + fileName);
        for (AbstractFile object : fileList) {
            object.display(depth + 1); // Increase depth for children
       
}
    }
}

 

public class ImageFile extends AbstractFile
{
    private String fileName;

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

    @Override
    public void add(AbstractFile element)
    {
        System.out.println("添加了一个图片文件");
    }

    @Override
    public void remove(AbstractFile element)
    {
        System.out.println("移除了一个图片文件");
    }

    @Override
    public void display(int depth) {
        for (int i = 0; i < depth; i++) {
            System.out.print("  "); // Indentation
       
}
        System.out.println(" -" + fileName + " 图片文件");
    }
}

 

public class TextFile extends AbstractFile
{
    private String fileName;

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

    @Override
    public void add(AbstractFile element)
    {
        System.out.println("添加了一个文本文件");
    }

    @Override
    public void remove(AbstractFile element)
    {
        System.out.println("移除了一个文本文件");
    }

    @Override
    public void display(int depth) {
        for (int i = 0; i < depth; i++) {
            System.out.print("  "); // Indentation
       
}
        System.out.println(" -" + fileName + " 文本文件");
    }
}

 

public class VideoFile extends AbstractFile
{
    private String fileName;

    public VideoFile(String fileName)
    {
        this.fileName = fileName;
    }

    @Override
    public void add(AbstractFile element)
    {
        System.out.println("添加了一个视频文件");
    }

    @Override
    public void remove(AbstractFile element)
    {
        System.out.println("删除了一个视频文件");
    }

    @Override
    public void display(int depth) {
        for (int i = 0; i < depth; i++) {
            System.out.print("  "); // Indentation
       
}
        System.out.println(" -" + fileName + " 视频文件");
    }
}

 

public class App
{
    public static void main(String[] args) {
        // 创建根文件夹
       
Folder rootFolder = new Folder("根文件夹");

        // 创建子文件夹
       
Folder imagesFolder = new Folder("图片文件夹");
        Folder videosFolder = new Folder("视频文件夹");

        // 创建文件
       
ImageFile image1 = new ImageFile("图片1.jpg");
        ImageFile image2 = new ImageFile("图片2.png");
        VideoFile video1 = new VideoFile("视频1.mp4");
        TextFile text1 = new TextFile("文本1.txt");

        // 在根文件夹中添加子文件夹和文件
       
rootFolder.add(imagesFolder);
        rootFolder.add(videosFolder);
        rootFolder.add(text1);

        // 在图片文件夹中添加图像文件
       
imagesFolder.add(image1);
        imagesFolder.add(image2);

        // 在视频文件夹中添加视频文件
       
videosFolder.add(video1);

        // 显示文件夹结构
       
rootFolder.display(0);
    }
}

运行示例结果

 

posted @ 2024-11-06 09:05  伐木工熊大  阅读(2)  评论(0编辑  收藏  举报