Паттерны / Паттерны поведения
image

<?php

//Handler
abstract class Rescuer {
    protected $next = null;
    public $code = 0;

    //HandleRequest()
    function help(int $code) {
        if ($this->code == $code) {
            $this->toHelp();
        } else if ($this->next != null) {
            $this->next->help($code);
        }
    }

    abstract function toHelp(); 
}

//ConcreteHandler
class Firefighter extends Rescuer {
    function __construct($next) {
        $this->next = $next;
        $this->code = 1;
    }

    function toHelp() {
        echo "call firefighters""\n";
    }
}

//ConcreteHandler
class Police extends Rescuer {
    function __construct($next) {
        $this->next = $next;
        $this->code = 2;
    }

    function toHelp() {
        echo "call the police""\n";
    }
}

//ConcreteHandler
class Ambulance extends Rescuer {
    function __construct($next) {
        $this->next = $next;
        $this->code = 3;
    }

    function toHelp() {
        echo "call an ambulance""\n";
    }
}

$ambulance = new Ambulance(null);
$police = new Police($ambulance);
$firefighter = new Firefighter($police);
$firefighter->help(1);
//printed: call firefighters
$firefighter->help(2);
//printed: call the police
$firefighter->help(3);
//printed: call an ambulance


Можно избежать жесткой зависимости отправителя запроса от его получателя, при этом запросом начинает обрабатываться один из нескольких объектов. Объекты-получатели связываются в цепочку, и запрос передается по цепочке, пока какой-то объект его не обработает.