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