Sobes.tech
Назад к вопросам
Middle — Senior
146

Какая основная задача паттерна мост и в чем его преимущества при проектировании систем?

Компании, где спрашивали
СБЕРСБЕР

Ответ от нейросети

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 лучше подходит для систем, которые должны расти без взрыва иерархий.