Sobes.tech
Middle — Middle+
125

Explicați conceptul și aplicarea șablonului de proiectare 'pod' în dezvoltarea software.

Companiile au fost întrebate
СБЕРСБЕР

Răspuns de la AI

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.