Урок 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();
}
}
Объяснение
-
Интерфейс
Shape
: Определяет методdraw()
, который будет реализован как простыми объектами, так и составным объектом. -
Классы
Circle
иRectangle
: Реализуют интерфейсShape
. Каждый из них определяет, как рисовать соответствующую фигуру. -
Класс
Drawing
: Реализует интерфейсShape
и содержит список объектовShape
. Он предоставляет методы для добавления и удаления фигур, а также реализует методdraw()
, который вызываетdraw()
для всех фигур в списке. -
Класс
CompositePatternDemo
: Демонстрирует использование компоновщика. Мы создаем несколько фигур и добавляем их в составной объектDrawing
. Затем вызываем методdraw()
, который рисует все фигуры.
Заключение
Паттерн "Компоновщик" позволяет клиентам работать с единичными объектами и группами объектов через один и тот же интерфейс. Это упрощает код и делает его более гибким. В приведенном примере мы увидели, как можно создать иерархию графических объектов и обрабатывать их единообразно.
пример
https://gitlab.com/synergy9980417/razdel2/7_8