PHP Паттерн “Цепочка ответственности” (Chain of Responsibility)
Позволяет передавать запрос по цепочке обработчиков, и каждый обработчик может решить, обрабатывать запрос или передать его следующему обработчику.
interface Response {
function handleRequest();
}
class ErrorResponse implements Response {
function handleRequest() {
echo "Error response\n";
}
}
class SuccessResponse implements Response {
function handleRequest() {
echo "Success response\n";
}
}
class Request {
private $_response;
function setResponse(Response $response) {
$this->_response = $response;
}
function sendRequest() {
$response = $this->_response;
while ($response) {
try {
$response->handleRequest();
return;
} catch (\Exception $e) {}
$response = $response->getNextResponse();
}
throw new \Exception('No response handler available.');
}
}
$request = new Request();
$request->setResponse(new ErrorResponse());
$request->sendRequest();
Когда может пригодиться
Обработка ошибок: можно создать цепочку ответственной обработки ошибок, где каждый следующий элемент цепочки принимает решение, как обрабатывать ошибку, если предыдущий элемент не смог ее обработать.
Маршрутизация запросов: можно использовать цепочку ответственности для определения маршрута запроса к нужному обработчику в зависимости от определенных условий.
Авторизация доступа: можно создать цепочку ответственных объектов, каждый из которых проверяет определенные условия доступа, такие как наличие прав пользователя или уровень доступа.
Логирование: можно создать цепочку объектов-регистраторов, каждый из которых записывает информацию об определенном уровне логирования.
Кэширование результатов запроса: можно создать цепочку кэширующих объектов, каждый из которых отвечает за свой тип кэширования (например, кэш в оперативной памяти, кэш на диске и т.д.).