Chain of Responsibility — это поведенческий паттерн, который позволяет передавать запрос по цепочке обработчиков. Каждый обработчик решает: обработать запрос или передать дальше.
Простыми словами: как эскалация тикета: L1 → L2 → L3 саппорт. Каждый уровень либо решает проблему, либо передаёт выше.
▪️ Пример:
Валидация HTTP-запроса: проверка аутентификации → авторизации → rate limit → бизнес-логика. Каждый шаг — звено цепочки.
// Абстрактный обработчик
abstract class RequestHandler {
private RequestHandler next;
public RequestHandler setNext(RequestHandler next) {
this.next = next;
return next; // для цепочки вызовов
}
public void handle(HttpRequest request) {
if (next != null) {
next.handle(request);
}
}
}
class AuthenticationHandler extends RequestHandler {
public void handle(HttpRequest request) {
if (request.getToken() == null) {
throw new SecurityException("Нет токена");
}
System.out.println("✓ Аутентификация пройдена");
super.handle(request); // передаём дальше
}
}
class RateLimitHandler extends RequestHandler {
private final Map<String, Integer> counters = new ConcurrentHashMap<>();
public void handle(HttpRequest request) {
int count = counters.merge(request.getIp(), 1, Integer::sum);
if (count > 100) {
throw new RuntimeException("429 Too Many Requests");
}
System.out.println("✓ Rate limit OK");
super.handle(request);
}
}
class BusinessLogicHandler extends RequestHandler {
public void handle(HttpRequest request) {
System.out.println("✓ Бизнес-логика выполнена");
// конец цепочки
}
}
// Сборка цепочки
RequestHandler chain = new AuthenticationHandler();
chain.setNext(new RateLimitHandler())
.setNext(new BusinessLogicHandler());
chain.handle(request);
▪️ Когда использовать
— Набор обработчиков и их порядок определяется динамически
— Запрос должен быть обработан одним из нескольких объектов, но каким — неизвестно заранее
— Классический пример: фильтры в Servlet API (javax.servlet.Filter)
▪️ Минус
Запрос может пройти всю цепочку и не быть обработанным; сложно отладить длинную цепочку.
🐸 Библиотека собеса по Java
#patterns