Ответ
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-серверов (например, аутентификация → логирование → обработка запроса).
- В обработке событий, где каждый обработчик решает, может ли он обработать событие.
Плюсы:
- Гибкость: можно динамически менять цепочку.
- Разделение ответственности: каждый обработчик выполняет свою задачу.
Минусы:
- Нет гарантии, что запрос будет обработан.
- Может усложнить отладку из-за множества переходов.