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

Объясните различия между паттернами декоратор, прокси и адаптер в контексте объектно-ориентированного программирования.

Компании, где спрашивали
SimbirsoftSimbirsoft

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

sobes.tech AI

Паттерны Декоратор, Прокси и Адаптер решают разные задачи, хотя все они работают с объектами и интерфейсами:

  • Декоратор (Decorator) — добавляет объектам новую функциональность динамически, оборачивая их. Позволяет расширять поведение без изменения исходного класса.

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

  • Адаптер (Adapter) — преобразует интерфейс одного класса в интерфейс, ожидаемый клиентом. Используется для интеграции несовместимых интерфейсов.

Пример на Java:

// Интерфейс
interface Service {
    void operation();
}

// Реализация
class RealService implements Service {
    public void operation() {
        System.out.println("Выполнение операции");
    }
}

// Декоратор
class Decorator implements Service {
    private Service wrappee;
    public Decorator(Service s) { this.wrappee = s; }
    public void operation() {
        System.out.println("Перед операцией");
        wrappee.operation();
        System.out.println("После операции");
    }
}

// Прокси
class Proxy implements Service {
    private RealService realService;
    public void operation() {
        if (realService == null) {
            realService = new RealService(); // ленивое создание
        }
        realService.operation();
    }
}

// Адаптер
class LegacyService {
    public void oldOperation() {
        System.out.println("Старый метод");
    }
}

class Adapter implements Service {
    private LegacyService legacy;
    public Adapter(LegacyService legacy) {
        this.legacy = legacy;
    }
    public void operation() {
        legacy.oldOperation();
    }
}