Sobes.tech
Back to questions
Junior — Middle
57

Можете объяснить отличия между паттернами Adapter и Decorator в контексте проектирования программного обеспечения?

Companies where asked
IBS

Answer from AI

sobes.tech AI

Паттерны Adapter и Decorator часто путают, но у них разные цели и способы применения:

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

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

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

  • Adapter меняет интерфейс объекта, чтобы он стал совместим с клиентом.
  • Decorator сохраняет интерфейс объекта, но добавляет новое поведение.

Пример на Java:

// Adapter: адаптируем интерфейс
interface Target {
    void request();
}

class Adaptee {
    void specificRequest() {
        System.out.println("Специфический запрос");
    }
}

class Adapter implements Target {
    private Adaptee adaptee;
    Adapter(Adaptee a) { this.adaptee = a; }
    public void request() {
        adaptee.specificRequest();
    }
}

// Decorator: добавляем поведение
interface Component {
    void operation();
}

class ConcreteComponent implements Component {
    public void operation() {
        System.out.println("Основная операция");
    }
}

class Decorator implements Component {
    protected Component component;
    Decorator(Component c) { this.component = c; }
    public void operation() {
        component.operation();
    }
}

class ConcreteDecorator extends Decorator {
    ConcreteDecorator(Component c) { super(c); }
    public void operation() {
        super.operation();
        System.out.println("Дополнительное поведение");
    }
}