Middle+
У чему се састоји разлика између образаца 'адаптер' и 'декоратор'?
sobes.tech АИ
Одговор од АИ
Адаптер преобразует интерфейс једног класа у интерфејс који очекује други класа, пружајући компатибилност између класа са неспојивим интерфејсима. Мења сигнатуру постојећих метода да би одговарала новом интерфејсу.
Декоратор динамички додаје нове обавезе објекту, обмотавајући га у декоратор. Не мења интерфејс декорисаног објекта, већ само проширује његову функционалност.
| Критеријум | Адаптер | Декоратор |
|---|---|---|
| Циљ | Компатибилност интерфејса | Проширење функционалности |
| Промена интерфејса | Да, претвара један у други | Не, чува постојећи |
| Структура | Обмотава прилагођени објекат | Обмотава декорисани објекат |
| Понашање | Меније позиве прилагођеном објекту | Додаје нове радње или мења постојеће |
| Пример | Претварање 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 "Додато понашање А" . PHP_EOL;
}
}