Sobes.tech
Middle+

Care este diferența dintre modelele 'adaptor' și 'decorator'?

sobes.tech AI

Răspuns de la AI

Adaptor convertează interfața unei clase în interfața așteptată de o altă clasă, asigurând compatibilitatea între clase cu interfețe incompatibile. Modifică semnătura metodelor existente pentru a se potrivi noii interfețe.

Decorator adaugă dinamic responsabilități noi unui obiect, învelindu-l într-un decorator. Nu schimbă interfața obiectului decorat, ci doar extinde funcționalitatea sa.

Criteriu Adapter Decorator
Scop Compatibilitate interfețe Extinderea funcționalității
Schimbare interfață Da, transformă una în alta Nu, păstrează cea existentă
Structură Împachetează obiectul adaptat Împachetează obiectul decorat
Comportament Schimbă apelurile către obiectul adaptat Adaugă noi acțiuni sau modifică cele existente
Exemplu Transformarea XML în JSON Adăugarea de logging la o clasă existentă
<?php

// Exemplu de Adapter
interface TargetInterface {
    public function request();
}

class Adaptee {
    public function specificRequest() {
        echo "Cerere specifică a Adaptee" . PHP_EOL;
    }
}

class Adapter implements TargetInterface {
    private $adaptee;

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

    public function request() {
        // Transformarea apelului
        $this->adaptee->specificRequest();
    }
}

// Exemplu de Decorator
interface Component {
    public function operation();
}

class ConcreteComponent implements Component {
    public function operation() {
        echo "Operație component concret" . 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 "Comportament adăugat A" . PHP_EOL;
    }
}