Sobes.tech
Назад к вопросам
Middle — Middle+
68

Объясните концепцию и применение шаблона проектирования 'мост' в разработке программного обеспечения.

Компании, где спрашивали
СБЕРСБЕР

Ответ от нейросети

sobes.tech AI

Шаблон проектирования «Мост» (Bridge) используется для разделения абстракции и её реализации так, чтобы они могли изменяться независимо друг от друга.

Идея в том, что у нас есть две иерархии классов: одна отвечает за абстракцию (интерфейс), другая — за реализацию. Абстракция содержит ссылку на объект реализации и делегирует ему работу. Это позволяет менять реализацию без изменения абстракции и наоборот.

Применение:

  • Когда нужно избежать жесткой связи между абстракцией и реализацией.
  • Когда обе части могут развиваться независимо.
  • Для поддержки нескольких вариантов реализации, которые могут комбинироваться с разными абстракциями.

Пример на Java:

// Реализация
interface Renderer {
    void renderCircle(float x, float y, float radius);
}

class VectorRenderer implements Renderer {
    public void renderCircle(float x, float y, float radius) {
        System.out.println("Drawing a circle as lines at (" + x + "," + y + ") with radius " + radius);
    }
}

class RasterRenderer implements Renderer {
    public void renderCircle(float x, float y, float radius) {
        System.out.println("Drawing pixels for circle at (" + x + "," + y + ") with radius " + radius);
    }
}

// Абстракция
abstract class Shape {
    protected Renderer renderer;
    public Shape(Renderer renderer) {
        this.renderer = renderer;
    }
    public abstract void draw();
}

class Circle extends Shape {
    private float x, y, radius;
    public Circle(Renderer renderer, float x, float y, float radius) {
        super(renderer);
        this.x = x; this.y = y; this.radius = radius;
    }
    public void draw() {
        renderer.renderCircle(x, y, radius);
    }
}

// Использование
Renderer renderer = new VectorRenderer();
Shape circle = new Circle(renderer, 5, 10, 7);
circle.draw();

Так можно менять способ отрисовки (VectorRenderer или RasterRenderer), не меняя класс Circle.