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);
}
}
运行示例结果