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

实验10:组合模式

本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:

1、理解组合模式的动机,掌握该模式的结构;

2、能够利用组合模式解决实际问题

 

[实验任务一]:组合模式

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

实验要求:

1.文件的执行不需真正实现,只需简单提示即可;

2.提交源代码;

3.注意编程规范。

 

 

// 文件和文件夹的抽象类

abstract class FileSystemElement {

    public abstract void execute();

    public abstract void add(FileSystemElement element);

    public abstract void remove(FileSystemElement element);

    public abstract FileSystemElement getChild(int i);

}

 

// 文件类

class File extends FileSystemElement {

    private String name;

 

    public File(String name) {

        this.name = name;

    }

 

    @Override

    public void execute() {

        System.out.println("执行文件:" + name);

    }

 

    @Override

    public void add(FileSystemElement element) {

        throw new UnsupportedOperationException();

    }

 

    @Override

    public void remove(FileSystemElement element) {

        throw new UnsupportedOperationException();

    }

 

    @Override

    public FileSystemElement getChild(int i) {

        throw new UnsupportedOperationException();

    }

}

 

// 文件夹类

class Folder extends FileSystemElement {

    private String name;

    private FileSystemElement[] children;

    private int currentSize = 0;

 

    public Folder(String name) {

        this.name = name;

        this.children = new FileSystemElement[10]; // 假设文件夹初始容量为10

    }

 

    @Override

    public void execute() {

        System.out.println("浏览文件夹:" + name);

        for (int i = 0; i < currentSize; i++) {

            children[i].execute();

        }

    }

 

    @Override

    public void add(FileSystemElement element) {

        if (currentSize < children.length) {

            children[currentSize++] = element;

        } else {

            // 可以在这里实现数组扩容逻辑

            throw new IllegalStateException("文件夹已满,无法添加更多元素");

        }

    }

 

    @Override

    public void remove(FileSystemElement element) {

        for (int i = 0; i < currentSize; i++) {

            if (children[i] == element) {

                for (int j = i; j < currentSize - 1; j++) {

                    children[j] = children[j + 1];

                }

                currentSize--;

                return;

            }

        }

        throw new IllegalArgumentException("文件夹中不存在该元素");

    }

 

    @Override

    public FileSystemElement getChild(int i) {

        if (i < 0 || i >= currentSize) {

            throw new IndexOutOfBoundsException("索引超出范围");

        }

        return children[i];

    }

}

 

// 客户端代码

public class Client {

    public static void main(String[] args) {

        Folder root = new Folder("根目录");

 

        File file1 = new File("文件1.txt");

        File file2 = new File("文件2.txt");

        Folder folder1 = new Folder("子文件夹1");

        Folder folder2 = new Folder("子文件夹2");

 

        root.add(file1);

        root.add(file2);

        root.add(folder1);

        root.add(folder2);

 

        folder1.add(new File("子文件夹1中的文件1.txt"));

        folder1.add(new File("子文件夹1中的文件2.txt"));

 

        folder2.add(new File("子文件夹2中的文件1.txt"));

 

        root.execute(); // 执行根目录,将递归执行所有子文件和子文件夹

    }

}

 

posted @ 2024-11-27 17:04  痛苦代码源  阅读(2)  评论(0编辑  收藏  举报