Gymterview
middle

Что такое паттерн Chain of Responsibility?

Chain of Responsibility – паттерн, передающий запрос по цепочке обработчиков. Каждый обработчик решает, обработать запрос самостоятельно или передать следующему.

Аналогия из жизни: Chain of Responsibility – как обработка обращения в техподдержку. Сначала отвечает бот, если не справился – оператор первой линии, затем специалист, затем инженер. Каждый уровень либо решает проблему, либо передаёт дальше.

Пример кода
abstract class Handler {
    private Handler next;

    Handler setNext(Handler next) {
        this.next = next;
        return next;
    }

    void handle(Request request) {
        if (canHandle(request)) {
            process(request);
        } else if (next != null) {
            next.handle(request);
        }
    }

    abstract boolean canHandle(Request request);
    abstract void process(Request request);
}

class AuthenticationHandler extends Handler {
    boolean canHandle(Request req) { return true; } // всегда проверяет
    void process(Request req) {
        if (!req.hasValidToken()) throw new UnauthorizedException();
    }
}

class RateLimitHandler extends Handler {
    boolean canHandle(Request req) { return true; }
    void process(Request req) {
        if (rateLimiter.isExceeded(req.getIp())) throw new TooManyRequestsException();
    }
}

// Построение цепочки
Handler chain = new AuthenticationHandler();
chain.setNext(new RateLimitHandler())
     .setNext(new BusinessLogicHandler());

chain.handle(request);

Примеры в Java-экосистеме

  • Servlet Filter – FilterChain.doFilter() – каждый фильтр вызывает следующий
  • Spring Security FilterChain – цепочка security-фильтров
  • Spring Interceptors – HandlerInterceptor.preHandle() / postHandle()
  • java.util.logging Handler – обработчики логов

Важное

  • Каждый обработчик отвечает за одну задачу (SRP)
  • Порядок обработчиков важен (auth -> rate limit -> validation -> business logic)
  • Обработчик может прервать цепочку или передать управление дальше

Частые ошибки

  • Запрос не обрабатывается никем – нужен default handler в конце цепочки
  • Слишком длинная цепочка – усложняет отладку; логируйте прохождение через каждый handler

Как используется в 2026

  • Servlet Filters, Spring Security – фундаментально построены на Chain of Responsibility
  • Middleware-паттерн в HTTP-фреймворках (аналогично)

На собеседовании: назовите Servlet Filter и Spring Security как примеры Chain of Responsibility – это покажет понимание реальных фреймворков. Частая ошибка – описать паттерн теоретически, но не связать с FilterChain из Spring.