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