Расскажи про опыт использования Chain of Responsibility

«Расскажи про опыт использования Chain of Responsibility» — вопрос из категории Архитектура, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Пример на Go:

type Handler interface {
    SetNext(Handler)
    Handle(string) string
}

type BaseHandler struct {
    next Handler
}

func (b *BaseHandler) SetNext(h Handler) {
    b.next = h
}

type AuthHandler struct {
    BaseHandler
}

func (a *AuthHandler) Handle(request string) string {
    if request == "auth" {
        return "Authenticated"
    }
    if a.next != nil {
        return a.next.Handle(request)
    }
    return ""
}

Где применял:

  • В middleware для HTTP-серверов (например, аутентификация → логирование → обработка запроса).
  • В обработке событий, где каждый обработчик решает, может ли он обработать событие.

Плюсы:

  • Гибкость: можно динамически менять цепочку.
  • Разделение ответственности: каждый обработчик выполняет свою задачу.

Минусы:

  • Нет гарантии, что запрос будет обработан.
  • Может усложнить отладку из-за множества переходов.