Паттерн "Мост" (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
| Bridge | Strategy | |
|---|---|---|
| Масштаб | Две независимые иерархии | Один алгоритм внутри объекта |
| Цель | Структурная развязка A x B | Подмена поведения конкретной операции |
Подробнее про Strategy — 117.
Риски
Bridge добавляет уровень абстракции и дополнительных классов. Если ось изменения одна, проще обычный интерфейс и полиморфизм.
См. также
См. также
Другие статьи этого же раздела в боковом меню (как на странице "О разделе"). Паттерн — это повторяющийся шаблон, узор или схема. Паттерны встречаются повсюду — в природе, архитектуре, поведении людей и, конечно, в программировании. Порождающие паттерны проектирования — это группа шаблонов, направленных на решение задач, связанных с созданием объектов. Структурные паттерны — это группа шаблонов проектирования, решающих задачи организации классов и объектов таким образом, чтобы обеспечить гибкую архитектуру программного обеспечения. Поведенческие паттерны — это группа шаблонов проектирования, которые определяют способы взаимодействия объектов и распределения ответственности между ними. Архитектурные паттерны — это проверенные решения для организации структуры программного обеспечения. Интеграция систем — одна из центральных задач в современной разработке программного обеспечения. Паттерны доменного моделирования представляют собой проверенные решения для организации бизнес-логики в программных системах. Паттерн Strategy в C# — классическая реализация через интерфейс, замена на Func и Action, DI и критерии выбора без лишних абстракций. Паттерн Iterator в C# — ручной IEnumerator, генерация итератора компилятором через yield return, ленивость, LINQ и случаи, когда класс писать всё же нужно. Abstract Factory в C# и .NET — классическая схема через интерфейсы, замена через DI-контейнер, фабричный делегат и keyed services в .NET 8. Паттерн Command в C# — классическая схема, делегаты, MediatR, очередь задач, undo и критерии выбора между объектом команды и простым вызовом сервиса. Паттерн Observer в C# — event и делегаты, IObservable IObserver, слабая связанность, отписка и как не поймать утечки памяти в долгоживущих сервисах.Обзор паттернов проектирования
Порождающие паттерны
Структурные паттерны
Поведенческие паттерны
Архитектурные паттерны
Паттерны интеграции внешних систем
Паттерны проектирования доменных моделей
Стратегия в C#
Итератор в C#
Фабрика в C#
Команда в C#
Наблюдатель в C#