1. 设计模式-组合模式

组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树状结构来表示整体与部分的层次结构。它使得用户对单个对象和组合对象的使用具有一致性,也就是说,组合对象可以被当作一个单独的对象来处理,而不需要知道它是组合还是单个对象。这使得客户端代码可以一致地处理所有的对象,无论是简单的叶节点对象还是复杂的组合对象。

组合模式通过定义一个抽象的组件类(Component),声明一个接口用于访问和管理子组件。这个接口在组合对象和叶子对象中有着不同的实现。组合对象(Composite)维护着子组件的集合,并实现了与子组件相关的操作(如添加、删除、获取子组件等)。叶子对象(Leaf)是组合中的基本对象,没有子组件。

假设我们构建一个文件系统目录结构,其中目录可以包含文件和子目录。

2. 抽象组件(Component)

public abstract class FileSystemComponent {
    private String name;

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

    public String getName() {
        return name;
    }

    public abstract void display(int depth);
}

3. 叶子对象(Leaf)

public class File extends FileSystemComponent {
    private int size;

    public File(String name, int size) {
        super(name);
        this.size = size;
    }

    public int getSize() {
        return size;
    }

    @Override
    public void display(int depth) {
        System.out.println(getIndent(depth) + getName() + " (Size: " + getSize() + ")");
    }

    private String getIndent(int depth) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < depth; i++) {
            sb.append("  ");
        }
        return sb.toString();
    }
}

4. 组合对象(Composite)

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

public class Directory extends FileSystemComponent {
    private List<FileSystemComponent> components = new ArrayList<>();

    public Directory(String name) {
        super(name);
    }

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

    public void remove(FileSystemComponent component) {
        components.remove(component);
    }

    public List<FileSystemComponent> getComponents() {
        return components;
    }

    @Override
    public void display(int depth) {
        System.out.println(getIndent(depth) + getName() + " (Directory)");
        for (FileSystemComponent component : components) {
            component.display(depth + 1);
        }
    }
}

5. 使用示例

public class CompositePatternDemo {
    public static void main(String[] args) {
        Directory rootDir = new Directory("root");
        Directory subDir1 = new Directory("subDir1");
        File file1 = new File("file1.txt", 100);
        File file2 = new File("file2.txt", 200);

        subDir1.add(file1);
        rootDir.add(subDir1);
        rootDir.add(file2);

        rootDir.display(0);
    }
}

组合模式非常适合处理具有层次结构的数据,如文件系统、组织结构等。它通过提供一个统一的方式来处理单个对象和组合对象,简化了客户端代码,同时也便于扩展和维护。然而,设计时需注意不要过度使用,避免结构过于复杂,影响系统的性能和可维护性。

6. 优点

  1. 结构清晰:组合模式清晰地定义了层次结构,易于管理对象的树形结构。
  2. 易扩展:容易添加新的组件类型,客户端可以一致地处理组合和叶子对象。
  3. 统一接口:客户端可以使用统一的接口来操作组合结构中的所有对象。

7. 缺点

  1. 设计复杂度增加:需要正确区分组件和叶子对象,以及管理树结构可能引入的复杂性。
  2. 性能问题:在深度嵌套的组合结构中,递归调用可能会影响性能