Skip to content

Урок 8. Компоновщик (Composite)

Шаблон проектирования "Компоновщик" (Composite) используется для создания иерархии объектов, где отдельные объекты и их группы могут быть обработаны одинаково. Это позволяет клиентам работать с единичными объектами и составными объектами (группами объектов) через один и тот же интерфейс.

Пример использования паттерна Composite на Java

Рассмотрим пример, в котором мы создадим структуру для представления графических объектов, таких как Circle и Rectangle, а также составной объект Drawing, который может содержать несколько графических объектов.

Шаг 1: Создание интерфейса

public interface Shape {
    void draw();
}

Шаг 2: Реализация простых объектов

public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a Circle");
    }
}

public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a Rectangle");
    }
}

Шаг 3: Реализация составного объекта

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

public class Drawing implements Shape {
    private List<Shape> shapes = new ArrayList<>();

    public void add(Shape shape) {
        shapes.add(shape);
    }

    public void remove(Shape shape) {
        shapes.remove(shape);
    }

    @Override
    public void draw() {
        for (Shape shape : shapes) {
            shape.draw();
        }
    }
}

Шаг 4: Использование компоновщика

Теперь мы можем использовать наш компоновщик в коде:

public class CompositePatternDemo {
    public static void main(String[] args) {
        Shape circle1 = new Circle();
        Shape circle2 = new Circle();
        Shape rectangle = new Rectangle();

        Drawing drawing = new Drawing();
        drawing.add(circle1);
        drawing.add(circle2);
        drawing.add(rectangle);

        // Рисуем все фигуры в drawing
        drawing.draw();
    }
}

Объяснение

  1. Интерфейс Shape: Определяет метод draw(), который будет реализован как простыми объектами, так и составным объектом.

  2. Классы Circle и Rectangle: Реализуют интерфейс Shape. Каждый из них определяет, как рисовать соответствующую фигуру.

  3. Класс Drawing: Реализует интерфейс Shape и содержит список объектов Shape. Он предоставляет методы для добавления и удаления фигур, а также реализует метод draw(), который вызывает draw() для всех фигур в списке.

  4. Класс CompositePatternDemo: Демонстрирует использование компоновщика. Мы создаем несколько фигур и добавляем их в составной объект Drawing. Затем вызываем метод draw(), который рисует все фигуры.

Заключение

Паттерн "Компоновщик" позволяет клиентам работать с единичными объектами и группами объектов через один и тот же интерфейс. Это упрощает код и делает его более гибким. В приведенном примере мы увидели, как можно создать иерархию графических объектов и обрабатывать их единообразно.

пример

https://gitlab.com/synergy9980417/razdel2/7_8