Sobes.tech
Back to questions
Junior — Middle
57

Объясните отличия между паттернами декоратор и прокси и их ситуации применения.

Companies where asked
AstonAston

Answer from AI

sobes.tech AI

Паттерны «Декоратор» и «Прокси» имеют схожую структуру — оба оборачивают объект и реализуют тот же интерфейс, но отличаются по назначению и применению.

Декоратор:

  • Используется для динамического добавления новых обязанностей объекту без изменения его кода.
  • Позволяет расширять функциональность объекта.
  • Пример: добавление логирования, кэширования, валидации поверх базового сервиса.

Прокси:

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

Пример различий:

  • Декоратор добавляет поведение (например, оборачивает поток ввода-вывода, добавляя шифрование).
  • Прокси может проверять права доступа перед вызовом метода реального объекта.
interface Service {
    void execute();
}

// Декоратор
class LoggingDecorator implements Service {
    private Service wrapped;
    public LoggingDecorator(Service s) { this.wrapped = s; }
    public void execute() {
        System.out.println("Before execution");
        wrapped.execute();
        System.out.println("After execution");
    }
}

// Прокси
class AccessProxy implements Service {
    private Service realService;
    public AccessProxy(Service s) { this.realService = s; }
    public void execute() {
        if (checkAccess()) {
            realService.execute();
        } else {
            throw new SecurityException("Access denied");
        }
    }
    private boolean checkAccess() { return true; /* логика проверки */ }
}

Итого, декоратор расширяет функциональность, прокси контролирует доступ и управление объектом.