Назад к вопросам
Middle+
156
questionbank

В чем заключается отличие между паттернами 'адаптер' и 'декоратор'?

Sobes Copilot

Получайте ответы в реальном времени

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

sobes.tech AI

Адаптер преобразует интерфейс одного класса в интерфейс, ожидаемый другим классом, предоставляя совместимость между классами с несовместимыми интерфейсами. Изменяет сигнатуру существующих методов для соответствия новому интерфейсу.

Декоратор динамически добавляет новые обязанности объекту, оборачивая его в декоратор. Не изменяет интерфейс декорируемого объекта, а лишь расширяет его функциональность.

Критерий Адаптер Декоратор
Цель Совместимость интерфейсов Расширение функциональности
Изменение интерфейса Да, преобразует один в другой Нет, сохраняет существующий
Структура Оборачивает адаптируемый объект Оборачивает декорируемый объект
Поведение Изменяет вызовы к адаптируемому объекту Добавляет новые действия или изменяет существующие
Пример Преобразование XML в JSON Добавление логирования к существующему классу
<?php

// Пример Адаптера
interface TargetInterface {
    public function request();
}

class Adaptee {
    public function specificRequest() {
        echo "Specific request of Adaptee" . PHP_EOL;
    }
}

class Adapter implements TargetInterface {
    private $adaptee;

    public function __construct(Adaptee $adaptee) {
        $this->adaptee = $adaptee;
    }

    public function request() {
        // Преобразование вызова
        $this->adaptee->specificRequest();
    }
}

// Пример Декоратора
interface Component {
    public function operation();
}

class ConcreteComponent implements Component {
    public function operation() {
        echo "Concrete component operation" . PHP_EOL;
    }
}

class Decorator implements Component {
    protected $component;

    public function __construct(Component $component) {
        $this->component = $component;
    }

    public function operation() {
        $this->component->operation();
    }
}

class ConcreteDecoratorA extends Decorator {
    public function operation() {
        parent::operation();
        $this->addedBehaviorA();
    }

    private function addedBehaviorA() {
        echo "Added behavior A" . PHP_EOL;
    }
}