Skip to content

Урок 10. Мост (Bridge)

Шаблон проектирования "Мост" (Bridge) используется для разделения абстракции и реализации, позволяя изменять их независимо друг от друга. Это особенно полезно, когда у вас есть несколько вариаций абстракций и реализаций, и вы хотите избежать создания множества подклассов.

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

Рассмотрим пример, в котором мы создадим систему для рисования фигур. У нас будет абстракция Shape и реализация DrawingAPI, которая будет представлять различные способы рисования (например, рисование на экране или в консоли).

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

public interface DrawingAPI {
    void drawCircle(double x, double y, double radius);
}

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

public class DrawingAPI1 implements DrawingAPI {
    @Override
    public void drawCircle(double x, double y, double radius) {
        System.out.println("API1.circle at " + x + ":" + y + " radius " + radius);
    }
}

public class DrawingAPI2 implements DrawingAPI {
    @Override
    public void drawCircle(double x, double y, double radius) {
        System.out.println("API2.circle at " + x + ":" + y + " radius " + radius);
    }
}

Шаг 3: Создание абстракции

public abstract class Shape {
    protected DrawingAPI drawingAPI;

    protected Shape(DrawingAPI drawingAPI) {
        this.drawingAPI = drawingAPI;
    }

    public abstract void draw();
    public abstract void resizeByPercentage(double pct);
}

Шаг 4: Реализация конкретных фигур

public class Circle extends Shape {
    private double x, y, radius;

    public Circle(double x, double y, double radius, DrawingAPI drawingAPI) {
        super(drawingAPI);
        this.x = x;
        this.y = y;
        this.radius = radius;
    }

    @Override
    public void draw() {
        drawingAPI.drawCircle(x, y, radius);
    }

    @Override
    public void resizeByPercentage(double pct) {
        radius *= (1 + pct / 100);
    }
}

Шаг 5: Использование моста

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

public class BridgePatternDemo {
    public static void main(String[] args) {
        Shape circle1 = new Circle(5, 10, 2, new DrawingAPI1());
        Shape circle2 = new Circle(20, 30, 3, new DrawingAPI2());

        circle1.draw();
        circle2.draw();

        circle1.resizeByPercentage(10);
        circle2.resizeByPercentage(20);

        circle1.draw();
        circle2.draw();
    }
}

Объяснение

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

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

  3. Абстрактный класс Shape: Содержит ссылку на DrawingAPI и определяет абстрактные методы draw() и resizeByPercentage().

  4. Класс Circle: Реализует абстракцию Shape. Он использует DrawingAPI для рисования круга и может изменять радиус.

  5. Класс BridgePatternDemo: Демонстрирует использование моста. Мы создаем экземпляры Circle с различными реализациями DrawingAPI и вызываем методы для рисования и изменения размера.

Заключение

Паттерн "Мост" позволяет разделить абстракцию и реализацию, что делает систему более гибкой и расширяемой. В приведенном примере мы увидели, как можно создать систему для рисования фигур, где абстракция и реализация могут изменяться независимо друг от друга.

пример

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