Java 设计模式之组合模式

发布于:2025-02-18 ⋅ 阅读:(139) ⋅ 点赞:(0)

Java 设计模式之组合模式

概述

  • 组合模式(Composite):将对象组合成树形结构以表示’部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
  • 优点:客户端可以统一处理单个对象和组合对象。支持递归组合,简化了复杂结构的处理。

UML

在这里插入图片描述

  • Component:抽象了或接口,定义叶子节点和组合节点的共同行为
  • Leaf:叶子节点,表示没有子组件。
  • Composite:组合节点,可以包含其他子组件。

代码实现

定义组件:

public abstract class Component {
    protected String name;

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

    /**
     * 显示
     *
     * @param level 第几层级
     */
    public abstract void display(int level);
}

定义叶子节点:

public class File extends Component {
    public File(String name) {
        super(name);
    }

    @Override
    public void display(int level) {
        System.out.println("-".repeat(level * 4) + "File:" + name);
    }
}

定义组合节点:

public class Directory extends Component {
    private ArrayList<Component> children = new ArrayList<>();

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

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

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

    @Override
    public void display(int level) {
        System.out.println("-".repeat(level * 4) + "Directory:" + name);
        for (Component component : children) {
            component.display(level + 1);
        }
    }
}

使用:

public class Client {
    public static void main(String[] args) {
        File file1 = new File("file1.txt");
        File file2 = new File("file2.txt");
        File file3 = new File("file3.txt");
        File file4 = new File("file4.txt");
        Directory root = new Directory("root");
        Directory dir1 = new Directory("dir1");
        Directory dir2 = new Directory("dir2");
        root.addComponent(file1);
        root.addComponent(dir1);
        dir1.addComponent(file2);
        dir1.addComponent(dir2);
        dir2.addComponent(file3);
        dir2.addComponent(file4);
        root.display(0);
    }
}

输出:

Directory:root
----File:file1.txt
----Directory:dir1
--------File:file2.txt
--------Directory:dir2
------------File:file3.txt
------------File:file4.txt