java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java组合模式

Java实现树形结构管理的组合设计模式

作者:.番茄炒蛋

Java组合模式是一种结构型设计模式,它允许将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户可以使用统一的方式处理单个对象和对象组合,从而简化了系统的设计和维护

介绍

Java组合模式(Composite Pattern)是一种结构型设计模式,允许你将对象组合成树状结构,并且能像使用独立对象一样使用它们.

组合模式包含以下3种角色:

组合模式的核心思想是将叶子节点和组合节点看作同一种类型的对象,让它们拥有相同的接口,从而在使用时能够无差别对待.

实现

假设我们正在编写一个文件系统的程序,需要实现对目录和文件的管理.我们可以使用组合模式来处理这种问题.

抽象构件

public abstract class AbstractFile {
    protected String name;
    public AbstractFile(String name) {
        this.name = name;
    }
    /**
     * 输入文件名;包含节点下的子节点
     */
    public abstract void display();
    /**
     * 添加文件
     * @param file
     */
    public abstract void add(AbstractFile file);
    /**
     * 删除文件
     * @param file
     */
    public abstract void remove(AbstractFile file);
}

叶子节点

public class File extends AbstractFile {
    public File(String name) {
        super(name);
    }
    /**
     * 输入文件名;包含节点下的子节点
     */
    @Override
    public void display() {
        System.out.println("这是文件:" + name);
    }
    /**
     * 添加文件
     *
     * @param file
     */
    @Override
    public void add(AbstractFile file) {
        throw new UnsupportedOperationException("文件不支持添加操作");
    }
    /**
     * 删除文件
     *
     * @param file
     */
    @Override
    public void remove(AbstractFile file) {
        throw new UnsupportedOperationException("文件不支持删除操作");
    }
}

组合节点

public class Directory extends AbstractFile {
    private List<AbstractFile> fileList = new ArrayList<>();
    public Directory(String name) {
        super(name);
    }
    @Override
    public void add(AbstractFile file) {
        fileList.add(file);
    }
    @Override
    public void remove(AbstractFile file) {
        fileList.remove(file);
    }
    /**
     * 输入文件名;包含节点下的子节点
     */
    @Override
    public void display() {
        System.out.println("这是目录:" + name);
        fileList.forEach(AbstractFile::display);
    }
}

测试

public class Demo {
    public static void main(String[] args) {
        AbstractFile root = new Directory("根目录");
        AbstractFile file1 = new File("文件1");
        AbstractFile file2 = new File("文件2");
        AbstractFile file3 = new File("文件3");
        AbstractFile file4 = new File("文件4");
        AbstractFile directory1 = new Directory("目录1");
        AbstractFile directory2 = new Directory("目录2");
        directory1.add(file1);
        directory1.add(file2);
        directory1.add(directory2);
        directory2.add(file3);
        directory2.add(file4);
        root.add(directory1);
        root.display();
    }
}

以上代码是一个完整的Java组合模式的示例,实现了一个简单的文件系统结构.根据文件和目录的特点,将其抽象为AbstractFile类,并定义了name属性以及抽象方法add();remove();display()并实现了两个具体的子类File和Directory.

在Directory类中,使用了一个List来储存文件和子目录,实现了add()和remove()方法,可以像其中添加和删除文件和子目录.同时display()方法遍历并打印出其子节点信息.

在File类中,由于文件没有子节点,因此在add()和remove()方法中抛出了UnsupportedOperationException异常,同时display()直接打印出文件信息.

总结

组合模式是一种结构型设计模式,允许我们将对象组合成属性结构来表现整体/部分层次结构,使得用户对单个对象和组合对象使用具有一致性.

优点

缺点

应用场景

组合模式常用于处理整体/部分层次结构的问题,适用于以下场景:

到此这篇关于Java实现树形结构管理的组合设计模式的文章就介绍到这了,更多相关Java组合模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文