Перейти к основному содержимому

Шаблон моста в Java

· 2 мин. чтения

1. Обзор

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

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

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

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

./04ebb0b820ccb9beeca9a6ebfcc37e13.jpg

Во-первых, мы определим цветовой интерфейс:

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 .