Sobes.tech
Middle+

¿En qué consiste la diferencia entre los patrones 'adaptador' y 'decorador'?

sobes.tech AI

Respuesta de la IA

Adaptador transforma la interfaz de una clase en la interfaz que espera otra clase, proporcionando compatibilidad entre clases con interfaces incompatibles. Cambia la firma de los métodos existentes para que coincidan con la nueva interfaz.

Decorador añade dinámicamente nuevas responsabilidades a un objeto envolviéndolo en un decorador. No cambia la interfaz del objeto decorado, solo amplía su funcionalidad.

Criterio Adaptador Decorador
Objetivo Compatibilidad de interfaces Extensión de funcionalidad
Cambio de interfaz Sí, transforma una en otra No, mantiene la existente
Estructura Envuelve el objeto adaptado Envuelve el objeto decorado
Comportamiento Cambia las llamadas al objeto adaptado Añade nuevas acciones o modifica las existentes
Ejemplo Transformación de XML a JSON Añadir registro a una clase existente
<?php

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

class Adaptee {
    public function specificRequest() {
        echo "Solicitud específica de Adaptee" . PHP_EOL;
    }
}

class Adapter implements TargetInterface {
    private $adaptee;

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

    public function request() {
        // Transformación de la llamada
        $this->adaptee->specificRequest();
    }
}

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

class ConcreteComponent implements Component {
    public function operation() {
        echo "Operación del 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 "Comportamiento añadido A" . PHP_EOL;
    }
}