Рубрики
Без рубрики

Составной Узор

Объединяйте объекты в древовидные структуры для представления иерархий частей и целых. Композит позволяет клиентам лечить… Помеченный тегом structural, pattern, design pattern, java.

Объединяйте объекты в древовидные структуры для представления иерархий частей и целых. Composite позволяет клиентам единообразно обрабатывать отдельные объекты и композиции объектов.

  • Компонент: объявляет интерфейс для объектов в композиции. Реализует поведение по умолчанию для интерфейса, общего для всех классов, в зависимости от обстоятельств. Объявляет интерфейс для доступа к его дочерним компонентам и управления ими. (необязательно) определяет интерфейс для доступа к родительскому компоненту в рекурсивной структуре и реализует его, если это уместно.
  • Лист: представляет листовые объекты в композиции. У листа нет детей. Определяет поведение для примитивных объектов в композиции.
  • Составной: определяет поведение для компонентов, имеющих дочерние элементы. Хранит дочерние компоненты. Реализует дочерние операции, связанные с интерфейсом компонента.
  • Клиент: управляет объектами в композиции через интерфейс компонента.
public class Main {

    public static void main(String[] args) {
        // Create a tree structure
        Composite root = new Composite("root");
        root.add(new Leaf("Leaf A"));
        root.add(new Leaf("Leaf B"));

        Composite comp = new Composite("Composite X");
        comp.add(new Leaf("Leaf XA"));
        comp.add(new Leaf("Leaf XB"));

        root.add(comp);
        root.add(new Leaf("Leaf C"));

        // Add and remove a leaf
        Leaf leaf = new Leaf("Leaf D");
        root.add(leaf);
        root.remove(leaf);

        // Recursively display tree
        root.display(1);
    }
}

public abstract class Component {
    protected String name;

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

    public abstract void add(Component c);

    public abstract void remove(Component c);

    public abstract void display(int depth);
}

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

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

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

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

    @Override
    public void display(int depth) {
        System.out.println("-".repeat(depth) + name);

        for (Component component : children) {
            component.display(depth + 2);
        }
    }
}

public class Leaf extends Component {

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

    @Override
    public void add(Component c) {
        System.out.println("Cannot add to a leaf");
    }

    @Override
    public void remove(Component c) {
        System.out.println("Cannot remove from a leaf");
    }

    @Override
    public void display(int depth) {
        System.out.println("-".repeat(depth) + name);
    }
}
-root
---Leaf A
---Leaf B
---Composite X
-----Leaf XA
-----Leaf XB
---Leaf C

eidherjulian61/дизайн-шаблоны

Основные шаблоны Проектирования

ид ・ 27 сентября ・ 1 минута чтения

Оригинал: “https://dev.to/eidher/composite-pattern-1an7”