Sobes.tech
Back to questions
Senior
3

Чем GoF паттерн Медиатор отличается от Прокси?

Companies where asked
Альфа КапиталАльфа Капитал

Answer from AI

sobes.tech AI

Паттерн Медиатор и Прокси решают разные задачи и имеют разные цели:

  • Медиатор (Mediator) — это поведенческий паттерн, который централизует взаимодействие между объектами. Вместо того, чтобы объекты напрямую взаимодействовали друг с другом, они общаются через медиатора, который координирует их работу. Это уменьшает связанность между компонентами и упрощает управление сложными взаимодействиями.

  • Прокси (Proxy) — это структурный паттерн, который предоставляет суррогат или заместителя для другого объекта, контролируя доступ к нему. Прокси может добавлять дополнительную логику (например, ленивую инициализацию, кэширование, контроль доступа) без изменения самого объекта.

Ключевые отличия:

  • Медиатор управляет взаимодействием между множеством объектов, выступая как центральный координатор.
  • Прокси контролирует доступ к одному объекту, выступая как его представитель.

Пример:

// Медиатор
interface Mediator {
    void notify(Component sender, String event);
}

class ConcreteMediator implements Mediator {
    private Component1 c1;
    private Component2 c2;

    public void setComponents(Component1 c1, Component2 c2) {
        this.c1 = c1;
        this.c2 = c2;
    }

    @Override
    public void notify(Component sender, String event) {
        if (event.equals("A")) {
            c2.doC();
        } else if (event.equals("B")) {
            c1.doD();
        }
    }
}

// Прокси
interface Service {
    void request();
}

class RealService implements Service {
    public void request() {
        System.out.println("Выполнение запроса");
    }
}

class ProxyService implements Service {
    private RealService realService;

    public void request() {
        if (realService == null) {
            realService = new RealService(); // ленивое создание
        }
        System.out.println("Прокси: дополнительная логика перед вызовом");
        realService.request();
    }
}