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;
}
}