Sobes.tech
Middle+

Mi a különbség az 'adapter' és a 'decorátor' minták között?

sobes.tech MI

Válasz az MI-től

Adapter átalakítja egy osztály interfészét egy másik osztály által elvárt interfésszé, biztosítva az inkompatibilis interfészekkel rendelkező osztályok közötti kompatibilitást. Megváltoztatja a meglévő metódusok aláírását, hogy megfeleljen az új interfésznek.

Dekorátor dinamikusan új felelősségeket ad egy objektumnak, azzal, hogy dekorátorba csomagolja. Nem változtatja meg a dekorált objektum interfészét, csak kibővíti funkcionalitását.

Kritérium Adapter Dekorátor
Cél Interfészek kompatibilitása Funkcionalitás bővítése
Interfész változtatás Igen, egyet másikra alakít át Nem, megőrzi a meglévőt
Struktúra Körülveszi az alkalmazkodó objektumot Körülveszi a dekorált objektumot
Viselkedés Megváltoztatja a hívásokat az alkalmazkodó objektumhoz Új műveleteket ad hozzá vagy módosítja a meglévőket
Példa XML-ből JSON-be való átalakítás Naplózás hozzáadása egy meglévő osztályhoz
<?php

// Adapter példa
interface TargetInterface {
    public function request();
}

class Adaptee {
    public function specificRequest() {
        echo "Specifikus kérés az Adaptee-től" . PHP_EOL;
    }
}

class Adapter implements TargetInterface {
    private $adaptee;

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

    public function request() {
        // Hívás átalakítása
        $this->adaptee->specificRequest();
    }
}

// Dekorátor példa
interface Component {
    public function operation();
}

class ConcreteComponent implements Component {
    public function operation() {
        echo "Konkrét komponens művelete" . 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 "Hozzáadott viselkedés A" . PHP_EOL;
    }
}