El patrón de la cadena de responsabilidad en PHP

El patrón de la cadena de responsabilidad nos permite encadenar el código de una manera emisor-receptor, mientras que los dos están desacoplados entre sí. Esto hace posible que más de un objeto maneje las solicitudes entrantes.

El siguiente ejemplo demuestra una posible implementación del patrón de cadena de responsabilidad utilizando la funcionalidad del registrador como ejemplo:

<?php
abstract class Logger
{
private $logNext = null;
public function logNext(Logger $logger)
{
$this->logNext = $logger;
return $this->logNext;
}
final public function push($message)
{
$this->log($message);
if ($this->logNext !== null) {
$this->logNext->push($message);
}
}
abstract protected function log($message);
}
class SystemLogger extends Logger
{
public function log($message)
{
echo 'SystemLogger log!', PHP_EOL;
}
}
class ElasticLogger extends Logger
{
protected function log($message)
{
echo 'ElasticLogger log!', PHP_EOL;
}
}
class MailLogger extends Logger
{
protected function log($message)
{
echo 'MailLogger log!', PHP_EOL;
}
}
// Client use
$systemLogger = new SystemLogger();
$elasticLogger = new ElasticLogger();
$mailLogger = new MailLogger();
$systemLogger
->logNext($elasticLogger)
->logNext($mailLogger);
$systemLogger->push('Stuff to log…');
//SystemLogger log!
//ElasticLogger log!
//MailLogger log!

Comenzamos creando una clase abstracta de Logger con tres métodos: logNext(), push() y log(). El método log() se definió como abstracto, lo que significa que la implementación se deja a las clases secundarias. El método logNext() es el ingrediente clave ya que mueve los objetos por la cadena. Luego creamos tres implementaciones concretas de la clase Logger: SystemLogger, ElasticLogger y MailLogger. Luego instanciamos una de las clases concretas de registradores y pasamos las otras dos instancias por la cadena usando el método logNext(). Finalmente, llamamos al método push() para activar la cadena.

Comparte