Статья
Шаблон проектирования "Цепочка обязанностей"

Шаблон проектирования "Цепочка обязанностей"

27 ноября 2017

По сути это набор обработчиков, которые по очереди получают запрос, а затем решают обрабатывать его или нет. Далее запрос передается дальше по цепочке.

abstract class Logger {
     const DEBUG = 1;
     const CRITICAL = 2;
     const NOTICE = 4;

     protected $mask = 0;
     protected $next;

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

     public function message($message, $priority) {
         if ($this->mask & $priority) {
             $this->writeMessage($message);
         }
         if ($this->getNext()) {
             $this->getNext()->message($message, $priority);
         }
     }

     abstract protected function writeMessage($message);

     public function setNext(Logger $next) {
         $this->next = $next;
     }

     public function getNext() {
         return $this->next;
     }
}

class ConsoleLogger extends Logger {
    protected function writeMessage($message)  {
        echo $message . PHP_EOL;
    }
}
 
class FileLogger extends Logger {
    protected function writeMessage($message) {
        $f = fopen("error.log", "a");
        fwrite($f, $message . PHP_EOL);
        fclose($f);
    }
}

 

Использование:

$logger = new ConsoleLogger(Logger::NOTICE);
$fileLogger = new FileLogger(Logger::CRITICAL | Logger::DEBUG | Logger::NOTICE);
$logger->setNext($fileLogger);

$logger->message("Notice message", Logger::NOTICE);
$logger->message("Critical error", Logger::CRITICAL);



Источники:

http://designpatternsphp.readthedocs.io/ru/latest/Behavioral/ChainOfResponsibilities/README.html
https://habrahabr.ru/company/mailru/blog/325492/