Middle+
Wat is het verschil tussen de patronen 'adapter' en 'decorator'?
sobes.tech AI
Antwoord van AI
Adapter zet de interface van een klasse om in de interface die door een andere klasse wordt verwacht, waardoor compatibiliteit tussen klassen met incompatibele interfaces wordt geboden. Wijzigt de handtekening van bestaande methoden zodat ze overeenkomen met de nieuwe interface.
Decorator voegt dynamisch nieuwe verantwoordelijkheden toe aan een object door het in een decorator te wikkelen. Wijzigt de interface van het gedecoreerde object niet, maar breidt de functionaliteit ervan uit.
| Criteria | Adapter | Decorator |
|---|---|---|
| Doel | Interface compatibiliteit | Functionaliteit uitbreiden |
| Wijziging van interface | Ja, transformeert de ene in de andere | Nee, behoudt de bestaande |
| Structuur | Omhult het aan te passen object | Omhult het gedecoreerde object |
| Gedrag | Wijzigt de aanroepen naar het aangepaste object | Voegt nieuwe acties toe of wijzigt bestaande |
| Voorbeeld | XML naar JSON conversie | Logging toevoegen aan een bestaande klasse |
<?php
// Voorbeeld van een Adapter
interface TargetInterface {
public function request();
}
class Adaptee {
public function specificRequest() {
echo "Specifiek verzoek van Adaptee" . PHP_EOL;
}
}
class Adapter implements TargetInterface {
private $adaptee;
public function __construct(Adaptee $adaptee) {
$this->adaptee = $adaptee;
}
public function request() {
// Omzetting van de oproep
$this->adaptee->specificRequest();
}
}
// Voorbeeld van een Decorator
interface Component {
public function operation();
}
class ConcreteComponent implements Component {
public function operation() {
echo "Kerncomponent operatie" . 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 "Toegevoegd gedrag A" . PHP_EOL;
}
}