设计模式之组合模式

组合模式(Composite)

定义

将对象组合成树形结构以表示“部分-整体”的层次结构。

使用场景

  • 当你的程序结构有类似树一样的层级关系时,例如文件系统,视图树,公司组织架构等等
  • 当你要以统一的方式操作单个对象和由这些对象组成的组合对象的时候。

主要角色

  1. Component(组件)
  2. Leaf(叶子节点)
  3. Composite(组合节点)

类图

image-20231228092708550

示例代码

安全模式

public interface FileSystemComponent {
    void display();
}
public class File implements FileSystemComponent {
    private final String name;

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

    @Override
    public void display() {
        System.out.println("File: " + name);
    }
}
public class Folder implements FileSystemComponent {
    private final String name;
    private final List<FileSystemComponent> components;

    public Folder(String name) {
        this.name = name;
        this.components = new ArrayList<>();
    }

    public void addComponent(FileSystemComponent component) {
        components.add(component);
    }

    @Override
    public void display() {
        System.out.println("Folder: " + name);
        for (FileSystemComponent component : components) {
            component.display();
        }
    }
}
public class Client {
    public static void main(String[] args) {
        // 创建文件和文件夹
        File file1 = new File("file1.txt");
        File file2 = new File("file2.txt");
        Folder folder1 = new Folder("Folder 1");
        Folder folder2 = new Folder("Folder 2");

        // 组合节点包含叶子节点
        folder1.addComponent(file1);
        folder1.addComponent(file2);

        // 组合节点包含另一个组合节点
        folder2.addComponent(folder1);

        // 显示整个文件系统结构
        folder2.display();
    }
}
Folder: Folder 2
Folder: Folder 1
File: file1.txt
File: file2.txt

透明模式

public interface FileSystemComponent {
    void display();

    void addComponent(FileSystemComponent component);
}
public class File implements FileSystemComponent {
    private final String name;

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

    @Override
    public void display() {
        System.out.println("File: " + name);
    }

    @Override
    public void addComponent(FileSystemComponent component) {
        throw new UnsupportedOperationException(this.name + "是文件,不支持添加");
    }
}
public class Folder implements FileSystemComponent {
    private final String name;
    private final List<FileSystemComponent> components;

    public Folder(String name) {
        this.name = name;
        this.components = new ArrayList<>();
    }

    public void addComponent(FileSystemComponent component) {
        components.add(component);
    }

    @Override
    public void display() {
        System.out.println("Folder: " + name);
        for (FileSystemComponent component : components) {
            component.display();
        }
    }
}
public class Client {
    public static void main(String[] args) {
        // 创建文件和文件夹
        FileSystemComponent file1 = new File("file1.txt");
        FileSystemComponent file2 = new File("file2.txt");
        FileSystemComponent folder1 = new Folder("Folder 1");
        FileSystemComponent folder2 = new Folder("Folder 2");

        // 组合节点包含叶子节点
        folder1.addComponent(file1);
        folder1.addComponent(file2);

        // 组合节点包含另一个组合节点
        folder2.addComponent(folder1);

        // 显示整个文件系统结构
        folder2.display();
    }
}

相关推荐

  1. 设计模式组合模式

    2024-03-09 23:46:07       10 阅读
  2. go设计模式组合设计模式

    2024-03-09 23:46:07       13 阅读
  3. 【前端设计模式组合模式

    2024-03-09 23:46:07       36 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-09 23:46:07       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-09 23:46:07       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-09 23:46:07       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-09 23:46:07       18 阅读

热门阅读

  1. 错误与异常之为何要异常

    2024-03-09 23:46:07       22 阅读
  2. webpack5基础--08_处理字体图标资源

    2024-03-09 23:46:07       24 阅读
  3. django收集静态文件

    2024-03-09 23:46:07       18 阅读
  4. 设计模式-访问者模式使用方法

    2024-03-09 23:46:07       23 阅读
  5. R语言系列1——R语言基础:入门篇

    2024-03-09 23:46:07       28 阅读
  6. 简易版axios实现-基于promise+XMLHttpRequest

    2024-03-09 23:46:07       23 阅读
  7. ESP32系列四:搭建http的webserver的服务器

    2024-03-09 23:46:07       25 阅读
  8. C++17之std::invoke: 使用和原理探究(全)

    2024-03-09 23:46:07       22 阅读
  9. Flutter第二弹:Widget

    2024-03-09 23:46:07       21 阅读
  10. C++ 类的前向声明的用法

    2024-03-09 23:46:07       25 阅读
  11. 【面试题】mysql常见面试题及答案总结

    2024-03-09 23:46:07       19 阅读