El Patrón Chain of Responsibility: Pasando la Antorcha

¡Saludos a todos los entusiastas del desarrollo! Esta semana retomamos nuestro viaje a través de los patrones de diseño, hoy veremos especificamente el patrón “Chain of Responsibility” (Cadena de Responsabilidad). Este patrón, como su nombre sugiere, se centra en la transmisión de responsabilidades de manera encadenada. ¿Curioso? ¡Vamos a explorarlo!
Introducción al Chain of Responsibility
El patrón Chain of Responsibility es una estrategia ingeniosa que nos permite desacoplar remitentes de destinatarios. Imagina una cadena de manejo de solicitudes, donde cada eslabón decide si puede manejar la solicitud o si debe pasarla al siguiente eslabón de la cadena. Esta flexibilidad facilita la incorporación y el ajuste dinámico de comportamientos sin comprometer la simplicidad del código.
Funcionamiento en Acción
Para comprender mejor el funcionamiento, imaginemos un sistema de atención al cliente donde cada agente tiene habilidades específicas. Si el primer agente no puede resolver la solicitud, la pasa al siguiente en la cadena. Este proceso continúa hasta que la solicitud se maneja o se llega al final de la cadena.
<?php
abstract class Manejador
{
protected $sucesor;
public function __construct($sucesor = null)
{
$this->sucesor = $sucesor;
}
public function manejarSolicitud($solicitud)
{
if ($this->sucesor) {
$this->sucesor->manejarSolicitud($solicitud);
}
}
}
class ManejadorConcretoA extends Manejador
{
public function manejarSolicitud($solicitud)
{
if ($solicitud === "TipoA") {
echo "ManejadorConcretoA maneja la solicitud TipoA.\n";
} else {
parent::manejarSolicitud($solicitud);
}
}
}
class ManejadorConcretoB extends Manejador
{
public function manejarSolicitud($solicitud)
{
if ($solicitud === "TipoB") {
echo "ManejadorConcretoB maneja la solicitud TipoB.\n";
} else {
parent::manejarSolicitud($solicitud);
}
}
}
// Uso del patrón
$manejadorA = new ManejadorConcretoA();
$manejadorB = new ManejadorConcretoB($manejadorA);
$manejadorB->manejarSolicitud("TipoA");
$manejadorB->manejarSolicitud("TipoB");
?>
Conclusión
El Chain of Responsibility se revela como un aliado poderoso cuando la lógica de manejo de solicitudes se puede dividir en eslabones interconectados. Al adoptar este patrón, promovemos la flexibilidad y la extensibilidad en nuestro código.