Middle+
V čem spočívá rozdíl mezi vzory 'adaptér' a 'dekorátor'?
sobes.tech AI
Odpověď od AI
Adaptér přeměňuje rozhraní jedné třídy na rozhraní, které očekává jiná třída, čímž zajišťuje kompatibilitu mezi třídami s nekompatibilními rozhraními. Mění podpisy stávajících metod tak, aby odpovídaly novému rozhraní.
Dekorátor dynamicky přidává nové odpovědnosti objektu tím, že jej obaluje v dekorátoru. Nemění rozhraní dekorovaného objektu, pouze rozšiřuje jeho funkčnost.
| Kritérium | Adaptér | Dekorátor |
|---|---|---|
| Cíl | Kompatibilita rozhraní | Rozšíření funkčnosti |
| Změna rozhraní | Ano, přeměňuje jedno na druhé | Ne, zachovává stávající |
| Struktura | Obaluje adaptovaný objekt | Obaluje dekorovaný objekt |
| Chování | Mění volání na adaptovaný objekt | Přidává nové akce nebo mění stávající |
| Příklad | Převod XML na JSON | Přidání logování ke stávající třídě |
<?php
// Příklad adaptéru
interface TargetInterface {
public function request();
}
class Adaptee {
public function specificRequest() {
echo "Specifická žádost Adaptee" . PHP_EOL;
}
}
class Adapter implements TargetInterface {
private $adaptee;
public function __construct(Adaptee $adaptee) {
$this->adaptee = $adaptee;
}
public function request() {
// Převod volání
$this->adaptee->specificRequest();
}
}
// Příklad dekorátoru
interface Component {
public function operation();
}
class ConcreteComponent implements Component {
public function operation() {
echo "Operace konkrétního 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 "Přidané chování A" . PHP_EOL;
}
}