Sobes.tech
Middle+

Qual é a diferença entre os padrões 'adaptador' e 'decorador'?

sobes.tech IA

Resposta da IA

Adaptador transforma a interface de uma classe na interface esperada por outra classe, proporcionando compatibilidade entre classes com interfaces incompatíveis. Altera a assinatura dos métodos existentes para corresponder à nova interface.

Decorador adiciona dinamicamente novas responsabilidades a um objeto envolvendo-o num decorador. Não altera a interface do objeto decorado, apenas amplia a sua funcionalidade.

Critério Adaptador Decorador
Objetivo Compatibilidade de interfaces Extensão de funcionalidade
Alteração de interface Sim, transforma uma em outra Não, mantém a existente
Estrutura Envolve o objeto adaptado Envolve o objeto decorado
Comportamento Altera as chamadas ao objeto adaptado Adiciona novas ações ou modifica as existentes
Exemplo Transformação de XML para JSON Adicionar logging a uma classe existente
<?php

// Exemplo de Adaptador
interface TargetInterface {
    public function request();
}

class Adaptee {
    public function specificRequest() {
        echo "Requisição específica do Adaptee" . PHP_EOL;
    }
}

class Adapter implements TargetInterface {
    private $adaptee;

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

    public function request() {
        // Transformação da chamada
        $this->adaptee->specificRequest();
    }
}

// Exemplo de Decorador
interface Component {
    public function operation();
}

class ConcreteComponent implements Component {
    public function operation() {
        echo "Operação do componente concreto" . 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 "Comportamento adicionado A" . PHP_EOL;
    }
}