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