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

Паттерн "Мост" (Bridge) в Java — тип уведомления и канал доставки

Разработчику Архитектору

Обзор паттерна — в структурных паттернах. Здесь — практический Bridge на Java для системы уведомлений.

Загрузка редактора схем…

Задача паттерна

Bridge разделяет абстракцию и реализацию, чтобы они развивались независимо.

Если у системы две оси изменений (например, тип уведомления × канал), наследование даёт комбинаторный взрыв классов. Bridge заменяет это композицией:

  • абстракция — что делаем;
  • реализация — как делаем.

Пример — уведомления

interface MessageSender {
void send(String message, String recipient);
}

class EmailSender implements MessageSender {
@Override
public void send(String message, String recipient) {
System.out.println("Email -> " + recipient + ": " + message);
}
}

class SmsSender implements MessageSender {
@Override
public void send(String message, String recipient) {
System.out.println("SMS -> " + recipient + ": " + message);
}
}

abstract class Notification {
protected final MessageSender sender;

protected Notification(MessageSender sender) {
this.sender = sender;
}

abstract void notify(String recipient, String message);
}

class UrgentNotification extends Notification {
UrgentNotification(MessageSender sender) {
super(sender);
}

@Override
void notify(String recipient, String message) {
sender.send("[СРОЧНО] " + message, recipient);
sender.send("[СРОЧНО] Повтор: " + message, recipient);
}
}

class RegularNotification extends Notification {
RegularNotification(MessageSender sender) {
super(sender);
}

@Override
void notify(String recipient, String message) {
sender.send(message, recipient);
}
}
Notification urgentSms = new UrgentNotification(new SmsSender());
urgentSms.notify("+79991234567", "Сервер недоступен");

Notification regularEmail = new RegularNotification(new EmailSender());
regularEmail.notify("dev@company.com", "Деплой завершен");

Любая комбинация собирается без создания отдельного класса UrgentSmsNotification.


Когда использовать

СигналПочему Bridge
Две ортогональные оси измененийСнимается взрыв подклассов
Нужна замена реализации в runtimeМеняем sender без правки абстракции
Платформы/каналы/драйверы развиваются отдельноКоманды работают параллельно над своими иерархиями

Bridge и Strategy

BridgeStrategy
МасштабДве независимые иерархииОдин алгоритм внутри объекта
ЦельСтруктурная развязка A x BПодмена поведения конкретной операции

Подробнее про Strategy — 117.


Риски

Bridge добавляет уровень абстракции и дополнительных классов. Если ось изменения одна, проще обычный интерфейс и полиморфизм.


См. также

См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").