设计模式 结构型模式 -- 组合模式实例:显示文件夹结构

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 运行结果



以上是关于设计模式 结构型模式 -- 组合模式实例:显示文件夹结构的主要内容,如果未能解决你的问题,请参考以下文章

java中组合模式详解和使用方法

23种设计模式之组合模式代码实例

3结构型模式(设计模式)

结构型模式-组合模式

设计模式——总结

设计模式——总结