Java学设计模式之组合模式

一、组合模式概念

1.1 什么是组合模式

组合模式是一种结构型设计模式,它允许你将对象组合成树状结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性,可以用统一的方式处理对象的访问。

结构

组合模式通常由以下几个部分组成:

  1. Component(组件): 定义了统一的接口,用于表示对象和对象集合的共同行为。
  2. Leaf(叶子节点): 表示树中的叶子节点对象,它实现了组件接口但没有子节点。
  3. Composite(组合节点): 表示树中的组合节点对象,它实现了组件接口并维护了一个子组件列表。
  4. Client(客户端): 使用组合模式的客户端代码。

二、组合模式代码

2.1 组件

public interface FileSystemItem {
    void display();
}

2.2 叶子节点

public class File implements FileSystemItem {

    private String name;

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

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

2.3 组合节点

public class Folder implements FileSystemItem {

    private String name;

    private List<FileSystemItem> children = new ArrayList<>();


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

    public void add(FileSystemItem item) {
        children.add(item);
    }


    public void remove(FileSystemItem item) {
        children.remove(item);
    }

    @Override
    public void display() {
        System.out.println("Folder: " + name);
        for (FileSystemItem item : children) {
            item.display();
        }
    }
}

2.4 测试类

public class CompositePatternTest {
    public static void main(String[] args) {
        // 创建文件和文件夹
        FileSystemItem file1 = new File("file1.txt");
        FileSystemItem file2 = new File("file2.txt");

        Folder folder1 = new Folder("Folder 1");
        folder1.add(file1);

        Folder folder2 = new Folder("Folder 2");
        folder2.add(file2);

        Folder rootFolder = new Folder("Root");
        rootFolder.add(folder1);
        rootFolder.add(folder2);

        // 显示文件系统结构
        rootFolder.display();

        // 输出:
        // Folder: Root
        // Folder: Folder 1
        // File: file1.txt
        // Folder: Folder 2
        // File: file2.txt
    }
}

三、总结

组合模式的优点包括:

  • 简化客户端代码,客户端可以一致地对待单个对象和组合对象。
  • 支持递归组合,可以构建任意复杂的层次结构。

缺点包括:

  • 在某些情况下可能会限制组件的类型,因为组件必须实现统一的接口。
  • 可能会增加设计的复杂性,特别是在处理递归结构时。
posted @ 2024-05-09 16:45  Kllin  阅读(30)  评论(0编辑  收藏  举报