Middle+
Care este diferența dintre modelele 'adaptor' și 'decorator'?
sobes.tech AI
Răspuns de la AI
Adaptor convertează interfața unei clase în interfața așteptată de o altă clasă, asigurând compatibilitatea între clase cu interfețe incompatibile. Modifică semnătura metodelor existente pentru a se potrivi noii interfețe.
Decorator adaugă dinamic responsabilități noi unui obiect, învelindu-l într-un decorator. Nu schimbă interfața obiectului decorat, ci doar extinde funcționalitatea sa.
| Criteriu | Adapter | Decorator |
|---|---|---|
| Scop | Compatibilitate interfețe | Extinderea funcționalității |
| Schimbare interfață | Da, transformă una în alta | Nu, păstrează cea existentă |
| Structură | Împachetează obiectul adaptat | Împachetează obiectul decorat |
| Comportament | Schimbă apelurile către obiectul adaptat | Adaugă noi acțiuni sau modifică cele existente |
| Exemplu | Transformarea XML în JSON | Adăugarea de logging la o clasă existentă |
<?php
// Exemplu de Adapter
interface TargetInterface {
public function request();
}
class Adaptee {
public function specificRequest() {
echo "Cerere specifică a Adaptee" . PHP_EOL;
}
}
class Adapter implements TargetInterface {
private $adaptee;
public function __construct(Adaptee $adaptee) {
$this->adaptee = $adaptee;
}
public function request() {
// Transformarea apelului
$this->adaptee->specificRequest();
}
}
// Exemplu de Decorator
interface Component {
public function operation();
}
class ConcreteComponent implements Component {
public function operation() {
echo "Operație component concret" . 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 "Comportament adăugat A" . PHP_EOL;
}
}