Sobes.tech
Middle+

V čem spočívá rozdíl mezi vzory 'adaptér' a 'dekorátor'?

sobes.tech AI

Odpověď od AI

Adaptér přeměňuje rozhraní jedné třídy na rozhraní, které očekává jiná třída, čímž zajišťuje kompatibilitu mezi třídami s nekompatibilními rozhraními. Mění podpisy stávajících metod tak, aby odpovídaly novému rozhraní.

Dekorátor dynamicky přidává nové odpovědnosti objektu tím, že jej obaluje v dekorátoru. Nemění rozhraní dekorovaného objektu, pouze rozšiřuje jeho funkčnost.

Kritérium Adaptér Dekorátor
Cíl Kompatibilita rozhraní Rozšíření funkčnosti
Změna rozhraní Ano, přeměňuje jedno na druhé Ne, zachovává stávající
Struktura Obaluje adaptovaný objekt Obaluje dekorovaný objekt
Chování Mění volání na adaptovaný objekt Přidává nové akce nebo mění stávající
Příklad Převod XML na JSON Přidání logování ke stávající třídě
<?php

// Příklad adaptéru
interface TargetInterface {
    public function request();
}

class Adaptee {
    public function specificRequest() {
        echo "Specifická žádost Adaptee" . PHP_EOL;
    }
}

class Adapter implements TargetInterface {
    private $adaptee;

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

    public function request() {
        // Převod volání
        $this->adaptee->specificRequest();
    }
}

// Příklad dekorátoru
interface Component {
    public function operation();
}

class ConcreteComponent implements Component {
    public function operation() {
        echo "Operace konkrétního komponentu" . 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 "Přidané chování A" . PHP_EOL;
    }
}