1. Обзор
Официальное определение шаблона проектирования Bridge, введенное Gang of Four (GoF), состоит в том, чтобы отделить абстракцию от ее реализации, чтобы они могли меняться независимо друг от друга.
Это означает создание интерфейса-моста, который использует принципы ООП для разделения обязанностей на разные абстрактные классы.
2. Пример шаблона моста
Для шаблона Bridge мы рассмотрим два уровня абстракции; один из них — геометрическая форма (например, треугольник и квадрат), заполненная разными цветами (наш второй слой абстракции):
Во-первых, мы определим цветовой интерфейс:
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 .