«1. Обзор

Официальное определение шаблона проектирования Bridge, введенное Gang of Four (GoF), состоит в том, чтобы отделить абстракцию от ее реализации, чтобы они могли изменяться независимо друг от друга.

Это означает создание интерфейса-моста, который использует принципы ООП для разделения обязанностей между различными абстрактными классами.

2. Пример шаблона моста

Для шаблона моста мы рассмотрим два уровня абстракции; один из них — геометрическая фигура (например, треугольник и квадрат), заполненная разными цветами (наш второй уровень абстракции):

Сначала мы определим цветовой интерфейс:

public interface Color {
    String fill();
}

Теперь мы создадим конкретный класс для этого интерфейса:

public class Blue implements Color {
    @Override
    public String fill() {
        return "Color is Blue";
    }
}

Давайте теперь создадим абстрактный класс Shape, который состоит из ссылки (моста) на объект Color:

public abstract class Shape {
    protected Color color;
    
    //standard constructors
    
    abstract public String draw();
}

Теперь мы создадим конкретный класс интерфейса Shape, который будет использовать метод из интерфейса Color:

public class Square extends Shape {

    public Square(Color color) {
        super(color);
    }

    @Override
    public String draw() {
        return "Square drawn. " + color.fill();
    }
}

Для этого шаблона будет верным следующее утверждение:

@Test
public void whenBridgePatternInvoked_thenConfigSuccess() {
    //a square with red color
    Shape square = new Square(new Red());
 
    assertEquals(square.draw(), "Square drawn. Color is Red");
}

Здесь мы используем шаблон Bridge и передаем желаемый объект цвета. Как видно из вывода, фигура отрисовывается желаемым цветом:

Square drawn. Color: Red
Triangle drawn. Color: Blue

3. Заключение

В этой статье мы рассмотрели шаблон проектирования моста. Это хороший выбор в следующих случаях:

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

Полный исходный код этого примера доступен на GitHub.