Назад к вопросам
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;
}
}