侧边栏壁纸
博主头像
人生短短几个秋

行动起来,活在当下

  • 累计撰写 45 篇文章
  • 累计创建 20 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

设计模式-组合模式

人生短短几个秋
2025-01-25 / 0 评论 / 0 点赞 / 14 阅读 / 0 字

设计模式 - 组合模式(Composite Pattern)

介绍

组合模式是一种结构型设计模式,它允许你将对象组合成树形结构来表示“整体-部分”的层次结构。组合模式使得用户可以一致地使用组合体和单个对象。

实现

我们以一个文件系统为例,来展示如何使用组合模式来模拟文件夹和文件的关系。

定义节点接口

首先定义一个节点接口,它代表文件系统中的任意元素(文件或文件夹)。

interface FileSystemNode {
    void add(FileSystemNode node);
    void remove(FileSystemNode node);
    FileSystemNode getChild(int index);
    void printList();
}

创建文件夹类

接着创建一个表示文件夹的类,它实现了 FileSystemNode 接口。

class Directory implements FileSystemNode {
    private String name;
    private List<FileSystemNode> children = new ArrayList<>();

    public Directory(String name) {
        this.name = name;
    }

    @Override
    public void add(FileSystemNode node) {
        children.add(node);
    }

    @Override
    public void remove(FileSystemNode node) {
        children.remove(node);
    }

    @Override
    public FileSystemNode getChild(int index) {
        return children.get(index);
    }

    @Override
    public void printList() {
        System.out.println(name);
        for (FileSystemNode child : children) {
            child.printList();
        }
    }
}

创建文件类

创建一个表示文件的类,它同样实现了 FileSystemNode 接口。

class File implements FileSystemNode {
    private String name;

    public File(String name) {
        this.name = name;
    }

    @Override
    public void add(FileSystemNode node) {
        throw new UnsupportedOperationException("Cannot add to a file.");
    }

    @Override
    public void remove(FileSystemNode node) {
        throw new UnsupportedOperationException("Cannot remove from a file.");
    }

    @Override
    public FileSystemNode getChild(int index) {
        throw new UnsupportedOperationException("Cannot get child of a file.");
    }

    @Override
    public void printList() {
        System.out.println(name);
    }
}

使用组合模式

接下来,在主程序中使用组合模式来构建文件系统的树形结构。

public class FileSystem {
    public static void main(String[] args) {
        // 创建根目录
        FileSystemNode rootDirectory = new Directory("root");

        // 创建子目录
        FileSystemNode subDirectory = new Directory("subdirectory");

        // 创建文件
        FileSystemNode file1 = new File("document.txt");
        FileSystemNode file2 = new File("presentation.pptx");

        // 将文件添加到子目录
        subDirectory.add(file1);
        subDirectory.add(file2);

        // 将子目录添加到根目录
        rootDirectory.add(subDirectory);

        // 打印文件系统的目录结构
        rootDirectory.printList();
    }
}

使用场景

组合模式适用于以下情况:

  • 你想表示对象的部分-整体层次结构。
  • 你需要一个树形结构来描述事物的层次关系。
  • 你想在不改变客户端的情况下,使用一个统一的接口来表示不同的对象层次。

总结

组合模式通过定义一个公共接口来表示树形结构中的各个组成部分,使得单个对象和组合对象可以一致地被对待。这种方式可以简化客户端代码,并且允许在运行时构建复杂的层次结构。


以上就是组合模式的一个实现案例,希望这篇文章能帮助你理解组合模式的使用方式及其应用场景。

0

评论区