Bridge — это структурный паттерн, который разделяет абстракцию и реализацию так, чтобы они могли изменяться независимо друг от друга.
Простыми словами: вместо одной толстой иерархии наследования вы разбиваете её на две независимые — «что делать» и «как делать» — и связываете их композицией.
▪️ Пример:
Система отправки уведомлений: типы уведомлений (срочное, обычное) × каналы доставки (email, SMS, push). Без Bridge это 6 классов, с каждым новым каналом — взрывной рост.
// Реализация — «как доставить»
interface MessageSender {
void send(String message, String recipient);
}
class EmailSender implements MessageSender {
public void send(String message, String recipient) {
System.out.println("Email → " + recipient + ": " + message);
}
}
class SmsSender implements MessageSender {
public void send(String message, String recipient) {
System.out.println("SMS → " + recipient + ": " + message);
}
}
// Абстракция — «что отправить»
abstract class Notification {
protected MessageSender sender; // мост к реализации
public Notification(MessageSender sender) {
this.sender = sender;
}
abstract void notify(String recipient, String message);
}
class UrgentNotification extends Notification {
public UrgentNotification(MessageSender sender) {
super(sender);
}
void notify(String recipient, String message) {
sender.send("[СРОЧНО] " + message, recipient);
sender.send("[СРОЧНО] Повторное напоминание: " + message, recipient);
}
}
class RegularNotification extends Notification {
public RegularNotification(MessageSender sender) {
super(sender);
}
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", "Деплой завершён");
▪️ Когда использовать
— Есть две ортогональные оси изменения (тип × реализация)
— Хотите избежать «взрыва» подклассов
— Нужно переключать реализацию в runtime
▪️ Bridge vs Strategy
— Strategy: меняет один алгоритм внутри объекта
— Bridge: разделяет целые иерархии абстракции и реализации
▪️ Минус
Усложняет код, если оси изменения всего одна — тогда достаточно обычного полиморфизма.
🐸 Библиотека собеса по Java
#patterns