Какую проблему решает паттерн проектирования Мост (Bridge) и как он это делает?

«Какую проблему решает паттерн проектирования Мост (Bridge) и как он это делает?» — вопрос из категории Паттерны, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Проблема без Моста: Shape (Фигура) может быть Circle или Square. Каждая фигура может быть отрисована в Red, Blue или Green. Это приводит к классам RedCircle, BlueCircle, RedSquare и т.д.

Решение с Мостом:

// 1. Иерархия Реализации (не зависит от абстракций)
interface Renderer {
    String renderShape();
}

class VectorRenderer implements Renderer {
    public String renderShape() {
        return "as vector graphics";
    }
}

class RasterRenderer implements Renderer {
    public String renderShape() {
        return "as pixels";
    }
}

// 2. Иерархия Абстракции (содержит ссылку на реализацию)
abstract class Shape {
    protected Renderer renderer; // Мост — композиция

    public Shape(Renderer renderer) {
        this.renderer = renderer;
    }

    public abstract String draw();
}

class Circle extends Shape {
    public Circle(Renderer renderer) {
        super(renderer);
    }

    public String draw() {
        return "Drawing Circle " + renderer.renderShape();
    }
}

// 3. Использование: Абстракция и реализация комбинируются динамически
Shape vectorCircle = new Circle(new VectorRenderer());
System.out.println(vectorCircle.draw()); // "Drawing Circle as vector graphics"

Shape rasterCircle = new Circle(new RasterRenderer());
System.out.println(rasterCircle.draw()); // "Drawing Circle as pixels"

Итог: Добавление новой фигуры или нового типа отрисовки требует создания только одного нового класса, а не серии комбинаций.