Middle+
Каква е разликата между моделите 'адаптер' и 'декоратор'?
sobes.tech AI
Отговор от AI
Адаптер преобразува интерфейса на един клас в интерфейса, който очаква друг клас, осигурявайки съвместимост между класове с несъвместими интерфейси. Променя подписите на съществуващите методи, за да съответстват на новия интерфейс.
Декоратор динамично добавя нови отговорности към обект, като го обвива в декоратор. Не променя интерфейса на декорирания обект, а само разширява неговата функционалност.
| Критерий | Адаптер | Декоратор |
|---|---|---|
| Цел | Съвместимост на интерфейсите | Разширяване на функционалността |
| Промяна на интерфейса | Да, преобразува един в друг | Не, запазва съществуващия |
| Структура | Обвива адаптирания обект | Обвива декорирания обект |
| Поведение | Променя извикванията към адаптирания обект | Добавя нови действия или променя съществуващите |
| Пример | Преобразуване XML в JSON | Добавяне на логиране към съществуващ клас |
<?php
// Пример за адаптер
interface TargetInterface {
public function request();
}
class Adaptee {
public function specificRequest() {
echo "Специфичен заявка на 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 "Операция на конкретния компонент" . 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 "Добавено поведение A" . PHP_EOL;
}
}