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;
    }
}