«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.