Sobes.tech
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;
    }
}