Sobes.tech
Middle+

Na czym polega różnica między wzorcami 'adapter' i 'dekorator'?

sobes.tech AI

Odpowiedź od AI

Adapter przekształca interfejs jednej klasy w interfejs oczekiwany przez inną klasę, zapewniając kompatybilność między klasami z niekompatybilnymi interfejsami. Zmienia sygnaturę istniejących metod, aby pasowały do nowego interfejsu.

Dekorator dynamicznie dodaje nowe obowiązki obiektowi, opakowując go w dekorator. Nie zmienia interfejsu dekorowanego obiektu, a jedynie rozszerza jego funkcjonalność.

Kryterium Adapter Dekorator
Cel Kompatybilność interfejsów Rozszerzenie funkcjonalności
Zmiana interfejsu Tak, przekształca jeden w drugi Nie, zachowuje istniejący interfejs
Struktura Opakowuje dostosowywany obiekt Opakowuje dekorowany obiekt
Zachowanie Zmienia wywołania do dostosowywanego obiektu Dodaje nowe działania lub zmienia istniejące
Przykład Konwersja XML do JSON Dodanie logowania do istniejącej klasy
<?php

// Przykład adaptera
interface TargetInterface {
    public function request();
}

class Adaptee {
    public function specificRequest() {
        echo "Specyficzne żądanie Adaptee" . PHP_EOL;
    }
}

class Adapter implements TargetInterface {
    private $adaptee;

    public function __construct(Adaptee $adaptee) {
        $this->adaptee = $adaptee;
    }

    public function request() {
        // Transformacja wywołania
        $this->adaptee->specificRequest();
    }
}

// Przykład dekoratora
interface Component {
    public function operation();
}

class ConcreteComponent implements Component {
    public function operation() {
        echo "Operacja komponentu" . 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 "Dodane zachowanie A" . PHP_EOL;
    }
}