设计模式 结构型模式 -- 组合模式实例:显示文件夹结构
Posted CodeJiao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式 结构型模式 -- 组合模式实例:显示文件夹结构相关的知识,希望对你有一定的参考价值。
1. 组合模式实例
1.1 需求描述
请用组合模式实现显示文件夹结构的功能, 按如下格式显示:
aaa
bbb
y.txt
xx.doc
ccc
ddd
z.ppt
1.2 代码实现
文件结构:
1.2.1 抽象构建角色 FileComponent.java
FileComponent.java
package combination;
import java.io.File;
/**
* @version v1.0
* @ClassName: FileComponent
* @Description: 文件组件:抽象构建
*/
public abstract class FileComponent
//文件组件
protected File file;
//文件组件的层级
protected int level;
//添加子文件/文件夹
public abstract void add(FileComponent fileComponent);
//移除子文件/文件夹
public abstract void remove(FileComponent fileComponent);
//获取指定的子文件/文件夹
public abstract FileComponent getChild(int index);
//打印子 子文件/子文件夹 名称的方法
public abstract void print();
//获取文件/文件夹的名称
public String getName()
return file.getName();
1.2.2 容器构件角色 FileFolder.java
FileFolder.java
package combination;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
* @version v1.0
* @ClassName: FileFolder
* @Description: 文件夹类 :容器构件
*/
public class FileFolder extends FileComponent
//文件夹可以有多个子文件夹或者子文件
private final List<FileComponent> fileComponentList = new ArrayList<>();
//构造方法
public FileFolder(File file, int level)
this.file = file;
this.level = level;
@Override
public void add(FileComponent fileComponent)
fileComponentList.add(fileComponent);
@Override
public void remove(FileComponent fileComponent)
fileComponentList.remove(fileComponent);
@Override
public FileComponent getChild(int index)
return fileComponentList.get(index);
@Override
public void print()
//打印菜单名称
for (int i = 0; i < level; i++)
System.out.print(" ");
System.out.println(file.getName());
//打印子菜单或者子菜单项名称
for (FileComponent component : fileComponentList)
component.print();
1.2.3 叶子构建角色 FileItem.java
FileItem.java
package ex05.combination;
import java.io.File;
/**
* @version v1.0
* @ClassName: FileItem
* @Description: 文件类:叶子构建
*/
public class FileItem extends FileComponent
public FileItem(File file, int level)
this.file = file;
this.level = level;
@Override
public void add(FileComponent fileComponent)
@Override
public void remove(FileComponent fileComponent)
@Override
public FileComponent getChild(int index)
return null;
public void print()
//打印文件的名称
for (int i = 0; i < level; i++)
System.out.print(" ");
System.out.println(file.getName());
1.2.4 客户端类:测试类Client.java
Client.java
package ex05.combination;
import java.io.File;
/**
* @version v1.0
* @ClassName: Client
* @Description: 客户端类:测试类
*/
public class Client
public static void main(String[] args)
//创建文件树
File file = new File("E:\\\\IDEACode\\\\2021pre-study\\\\design-patterns-study\\\\src");
FileComponent component = new FileFolder(file, 1);
buildFileTree(component, file, 2);
//打印菜单名称(如果有子菜单一块打印)
component.print();
public static void buildFileTree(FileComponent component, File file, int level)
FileFolder fileFolder = null;
if (file.isDirectory())
for (File listFile : file.listFiles())
if (listFile.isDirectory())
fileFolder = new FileFolder(listFile, level);
component.add(fileFolder);
buildFileTree(fileFolder, listFile, level + 1);
else
FileItem fileItem = new FileItem(listFile, level);
component.add(fileItem);
1.3 运行结果
以上是关于设计模式 结构型模式 -- 组合模式实例:显示文件夹结构的主要内容,如果未能解决你的问题,请参考以下文章