软件设计:实验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(); // 执行根目录,将递归执行所有子文件和子文件夹
}
}