Ответ
Паттерн Мост (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"
Итог: Добавление новой фигуры или нового типа отрисовки требует создания только одного нового класса, а не серии комбинаций.