Sobes.tech
Middle+

V čom spočíva rozdiel medzi vzormi 'adaptér' a 'dekorátor'?

sobes.tech AI

Odpoveď od AI

Adapter preoblikuje sučelje jednog razreda u sučelje koje očekuje drugi razred, pružajući kompatibilnost između razreda s nespojivim sučeljima. Mijenja potpis postojećih metoda kako bi odgovarale novom sučelju.

Dekorator dinamički dodaje nove obveze objektu, obavijajući ga u dekorator. Ne mijenja sučelje dekoriranog objekta, već samo proširuje njegovu funkcionalnost.

Kriterij Adapter Dekorator
Svrha Kompatibilnost sučelja Proširenje funkcionalnosti
Promjena sučelja Da, pretvara jedno u drugo Ne, zadržava postojeće
Struktura Obavija prilagođeni objekt Obavija dekorirani objekt
Ponašanje Mijenja pozive prema prilagođenom objektu Dodaje nove radnje ili mijenja postojeće
Primjer Pretvaranje XML u JSON Dodavanje logiranja postojećem razredu
<?php

// Primjer Adaptera
interface TargetInterface {
    public function request();
}

class Adaptee {
    public function specificRequest() {
        echo "Specifičan zahtjev od Adaptee" . PHP_EOL;
    }
}

class Adapter implements TargetInterface {
    private $adaptee;

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

    public function request() {
        // Pretvaranje poziva
        $this->adaptee->specificRequest();
    }
}

// Primjer Dekoratora
interface Component {
    public function operation();
}

class ConcreteComponent implements Component {
    public function operation() {
        echo "Konkretna operacija komponente" . 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 "Dodano ponašanje A" . PHP_EOL;
    }
}