Какая основная задача паттерна мост и в чем его преимущества при проектировании систем?
Ответ от нейросети
sobes.tech AI
Что хотят услышать интервьюеры:
Паттерн мост нужен, чтобы разделить абстракцию и её реализацию и развивать их независимо друг от друга. Он особенно полезен, когда нужно избежать взрыва числа классов при комбинации разных вариантов. В результате система становится гибче, проще для расширения и сопровождения.
Определение:
Bridge — это структурный паттерн, который выносит реализацию в отдельную иерархию и связывает её с абстракцией через композицию, а не наследование. Абстракция хранит ссылку на объект реализации и делегирует ему часть работы. Это позволяет менять обе стороны независимо.
Пример использования:
Например, есть разные типы уведомлений: email, SMS, push, и разные способы отправки: через обычный канал, через резервный канал, через сторонний сервис. Без моста пришлось бы создавать много классов для каждой комбинации. С мостом можно отдельно описать тип уведомления и отдельно способ отправки.
interface Sender {
void send(String text);
}
class EmailSender implements Sender {
@Override
public void send(String text) {
System.out.println("Email: " + text);
}
}
class SmsSender implements Sender {
@Override
public void send(String text) {
System.out.println("SMS: " + text);
}
}
abstract class Notification {
protected final Sender sender;
protected Notification(Sender sender) {
this.sender = sender;
}
abstract void notifyUser(String message);
}
class AlertNotification extends Notification {
public AlertNotification(Sender sender) {
super(sender);
}
@Override
void notifyUser(String message) {
sender.send("[ALERT] " + message);
}
}
class InfoNotification extends Notification {
public InfoNotification(Sender sender) {
super(sender);
}
@Override
void notifyUser(String message) {
sender.send("[INFO] " + message);
}
}
Пояснение кода:
В примере Sender — это отдельная иерархия реализации, а Notification — абстракция. Класс уведомления не знает, как именно отправляется сообщение, он лишь делегирует это объекту sender.
Шаги работы такие: сначала выбирается способ отправки, затем создаётся нужный тип уведомления, после чего вызов notifyUser() приводит к делегированию в send(). Это и есть суть моста: две независимые оси расширения соединены через композицию.
Ключевые моменты:
- Мост решает проблему роста числа классов при множестве комбинаций абстракций и реализаций.
- Он заменяет жесткую связь через наследование на гибкую связь через композицию.
- Абстракцию и реализацию можно менять и расширять независимо.
- Паттерн особенно полезен, когда «что делать» и «как делать» — это разные оси изменения.
- В отличие от наследования, Bridge лучше подходит для систем, которые должны расти без взрыва иерархий.