结构型模式-5.组合模式(Composite Pattern)

 2024-07-29    0 条评论    58 浏览

设计模式

组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

组合模式的结构

在组合模式中,有以下几个角色:

  1. Component(组件):声明了组合中对象的接口,可以是抽象类或接口,提供了管理子对象的方法。

  2. Leaf(叶子):表示组合中的叶节点对象,它没有子节点,实现了组件接口。

  3. Composite(容器):表示组合中的容器节点对象,它可以包含子节点(叶子或其他容器),实现了组件接口的操作方法。

示例代码

让我们通过一个文件系统的例子来说明组合模式。文件系统可以有文件和文件夹,文件夹可以包含文件或其他文件夹,形成一个树形结构。

1. 组件接口(Component)

// 组件接口
interface FileSystemComponent {
    void printName();
}

2. 叶子节点(Leaf):文件类

// 叶子节点:文件类
class File implements FileSystemComponent {
    private String name;

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

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

3. 容器节点(Composite):文件夹类

import java.util.ArrayList;
import java.util.List;

// 容器节点:文件夹类
class Folder implements FileSystemComponent {
    private String name;
    private List<FileSystemComponent> children = new ArrayList<>();

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

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

    public void removeComponent(FileSystemComponent component) {
        children.remove(component);
    }

    @Override
    public void printName() {
        System.out.println("Folder: " + name);
        for (FileSystemComponent component : children) {
            component.printName();
        }
    }
}

4. 客户端代码示例

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

        Folder folder1 = new Folder("Folder 1");
        folder1.addComponent(file1);
        folder1.addComponent(file2);

        Folder folder2 = new Folder("Folder 2");
        folder2.addComponent(file3);
        folder2.addComponent(folder1);

        // 打印文件系统结构
        folder2.printName();
    }
}

解释

  • FileSystemComponent 接口定义了组件的公共操作,这里是 printName() 方法。
  • File 类实现了 FileSystemComponent 接口,表示文件。
  • Folder 类也实现了 FileSystemComponent 接口,表示文件夹,它可以包含文件和其他文件夹作为其子节点。
  • 在客户端代码中,我们创建了几个文件和文件夹对象,然后将它们组合成一个文件系统的结构,最后通过调用根节点(folder2)的 printName() 方法来打印整个文件系统的结构。

组合模式使得客户端可以统一地处理单个对象和组合对象,对于文件系统这样的层次结构特别有用。