Sobes.tech
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;
    }
}