Sobes.tech
Middle+

Was ist der Unterschied zwischen den Mustern 'Adapter' und 'Dekorateur'?

sobes.tech KI

Antwort von AI

Adapter wandelt die Schnittstelle einer Klasse in die Schnittstelle um, die von einer anderen Klasse erwartet wird, und sorgt so für Kompatibilität zwischen Klassen mit inkompatiblen Schnittstellen. Ändert die Signatur der bestehenden Methoden, um sie an die neue Schnittstelle anzupassen.

Decorator fügt einem Objekt dynamisch neue Verantwortlichkeiten hinzu, indem es es in einen Decorator einschließt. Ändert nicht die Schnittstelle des dekorierten Objekts, sondern erweitert nur seine Funktionalität.

Kriterium Adapter Decorator
Ziel Schnittstellenkompatibilität Erweiterung der Funktionalität
Änderung der Schnittstelle Ja, wandelt eine in die andere um Nein, erhält die bestehende Schnittstelle
Struktur Umhüllt das anzupassende Objekt Umhüllt das dekorierte Objekt
Verhalten Ändert die Aufrufe an das angepasste Objekt Fügt neue Aktionen hinzu oder ändert bestehende
Beispiel Umwandlung von XML in JSON Hinzufügen von Logging zu einer bestehenden Klasse
<?php

// Beispiel eines Adapters
interface TargetInterface {
    public function request();
}

class Adaptee {
    public function specificRequest() {
        echo "Spezifische Anfrage von Adaptee" . PHP_EOL;
    }
}

class Adapter implements TargetInterface {
    private $adaptee;

    public function __construct(Adaptee $adaptee) {
        $this->adaptee = $adaptee;
    }

    public function request() {
        // Umwandlung des Aufrufs
        $this->adaptee->specificRequest();
    }
}

// Beispiel eines Decorators
interface Component {
    public function operation();
}

class ConcreteComponent implements Component {
    public function operation() {
        echo "Operation des konkreten Components" . 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 "Hinzugefügtes Verhalten A" . PHP_EOL;
    }
}