Что такое паттерн Chain of Responsibility
Что проверяют
Понимаете ли вы, зачем цепочка обработчиков нужна, и видите ли её в том, чем пользуетесь каждый день. В C# это конвейер промежуточных слоёв веб-приложения и цепочка обработчиков у HTTP-клиента, а не только учебный пример с абстрактным классом.
Как отвечать
Chain of Responsibility это поведенческий паттерн: запрос идёт по цепочке обработчиков, каждый решает, ответить самому, дополнить и передать дальше или оборвать обработку. Отправитель не знает, кто именно ответит, а состав и порядок цепочки задаются при сборке.
abstract class Handler
{
private Handler? _next;
public Handler SetNext(Handler next)
{
_next = next;
return next;
}
public virtual Decision Handle(Request request) =>
_next is null ? Decision.Pass : _next.Handle(request);
}
sealed class LimitHandler : Handler
{
public override Decision Handle(Request request) =>
request.Amount > request.Limit ? Decision.Reject : base.Handle(request);
}Из платформы уместно назвать конвейер обработки запроса, где каждый компонент получает запрос и вызывает следующий, цепочку обработчиков сообщений у HTTP-клиента (повторы, логирование, подстановка токена) и фильтры перед действием контроллера.
Скажите и про границы применения: цепочка оправдана, когда обработчиков несколько, состав меняется и запрос может остаться необработанным. Когда обработчик один и известен заранее, это лишняя косвенность.
Где спотыкаются
Путают с декоратором. Декоратор обязательно вызывает вложенный объект и наращивает поведение, а звено цепочки вправе остановиться и ответить само; именно возможность прервать обработку и отличает паттерн.
Забывают про конец цепочки. У последнего звена следующего нет, и запрос либо роняет вызов по пустой ссылке, либо молча исчезает без ответа. Поведение по умолчанию описывается явно, отдельным замыкающим звеном.
Сшивают звенья вручную в разных местах кода. Порядок начинает отличаться в приложении и в тестах, а ошибка в порядке (проверка прав после списания средств) всплывает уже на проде. Сборка цепочки должна жить в одном месте, рядом с регистрацией зависимостей.