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