El patrón de diseño Adapter se utiliza cuando deseas que una clase existente funcione con otra clase o sistema sin modificar su código original. Es muy útil cuando tienes código antiguo (por ejemplo, legado) o una librería de terceros, y deseas integrarlo con un sistema nuevo que espera una interfaz diferente. El patrón Adapter permite que dos clases incompatibles colaboren adaptando una interfaz a otra.
Imaginemos que tenemos un sistema de pagos antiguo y queremos integrarlo con un sistema nuevo. El código espagueti es difícil de mantener porque mezcla la lógica del sistema nuevo con el antiguo de manera desordenada.
class PagoAntiguo {
public function realizarPago($monto) {
echo "Procesando el pago de: $monto mediante el sistema antiguo.\n";
}
}
class SistemaDePagos {
public function procesarPago($monto) {
// Lógica para decidir qué sistema usar
if ($monto < 1000) {
$pago = new PagoAntiguo();
$pago->realizarPago($monto);
} else {
echo "Procesando el pago de: $monto mediante el nuevo sistema de pagos.\n";
}
}
}
// Ejecución del código espagueti
$sistema = new SistemaDePagos();
$sistema->procesarPago(500); // Usa el sistema antiguo
$sistema->procesarPago(1500); // Usa el sistema nuevo
SistemaDePagos
está acoplado directamente al sistema de pago antiguo, lo que hace difícil cambiar el comportamiento.SistemaDePagos
se volverá aún más compleja.Podemos implementar un adaptador que convierta la interfaz del sistema de pago antiguo para que funcione con el sistema nuevo, desacoplando ambos.
// El sistema nuevo de pagos tiene su propia interfaz
interface IPago {
public function pagar($monto);
}
// El sistema antiguo, que no podemos modificar
class PagoAntiguo {
public function realizarPago($monto) {
echo "Procesando el pago de: $monto mediante el sistema antiguo.\n";
}
}
// Adaptador para el sistema antiguo, implementando la interfaz IPago
class PagoAntiguoAdapter implements IPago {
private $pagoAntiguo;
public function __construct(PagoAntiguo $pagoAntiguo) {
$this->pagoAntiguo = $pagoAntiguo;
}
public function pagar($monto) {
// Adaptamos el método antiguo al nuevo
$this->pagoAntiguo->realizarPago($monto);
}
}
// Sistema de pagos moderno
class PagoModerno implements IPago {
public function pagar($monto) {
echo "Procesando el pago de: $monto mediante el nuevo sistema de pagos.\n";
}
}
// El cliente ahora no necesita preocuparse sobre cuál sistema se usa
class SistemaDePagos {
private $adaptador;
public function __construct(IPago $adaptador) {
$this->adaptador = $adaptador;
}
public function procesarPago($monto) {
$this->adaptador->pagar($monto);
}
}
// Uso del sistema con el adaptador
// Para el sistema antiguo
$pagoAntiguo = new PagoAntiguo();
$adaptadorAntiguo = new PagoAntiguoAdapter($pagoAntiguo);
$sistema = new SistemaDePagos($adaptadorAntiguo);
$sistema->procesarPago(500); // Usa el adaptador del sistema antiguo
// Para el sistema moderno
$pagoModerno = new PagoModerno();
$sistemaModerno = new SistemaDePagos($pagoModerno);
$sistemaModerno->procesarPago(1500); // Usa el sistema nuevo
SistemaDePagos
no sabe ni le importa si está usando el sistema antiguo o moderno. Solo interactúa con una interfaz común (IPago
).IPago
sin modificar el código existente.Esta web se reserva el derecho de suprimir, por cualquier razón y sin previo aviso, cualquier contenido generado en los espacios de participación en caso de que los mensajes incluyan insultos, mensajes racistas, sexistas... Tampoco se permitirán los ataques personales ni los comentarios que insistan en boicotear la labor informativa de la web, ni todos aquellos mensajes no relacionados con la noticia que se esté comentando. De no respetarse estas mínimas normas de participación este medio se verá obligado a prescindir de este foro, lamentándolo sinceramente por todos cuantos intervienen y hacen en todo momento un uso absolutamente cívico y respetuoso de la libertad de expresión.
No hay opiniones. Sé el primero en escribir.