Chain Of Responsibility vs Event Bus, в чем принципиальная разница?
Привет,
Чем принципиально отличаются паттерны Chain of Responsibility и Event Bus?
Chain of Responsibility нужен для ослабления связи между сущностями, придания системе гибкости, и возможности множественной обработки единственного входящего запроса.
Event Bus решает эти же проблемы, и при реализации с обрывом цепи обработки, достигается ровно тот же эффект, как и Chain Of Responsibility, но с одним плюсом в виде отсутствия необходимости создания цепей вручную, так как привязка идет по событию.
Допустим, речь идет о получении ответа от обработчиков, но в таком случае аналогичный эффект можно получить и от Event Bus.
Пока есть одна мысль, это Tree of Responsibility, это позволяет создать более сложные цепи обработки, которые никак не достичь при помощи Event Bus, который всегда линейный.
1. Если нужен порядок обработки в event bus, возможно у вас в системе есть проблемы(см. Temporal coupling)
2. Да, паттерны решают похожие задачи, есть разница в децентрализации. В Chain if responsibility есть менеджер который который цепочку вызывает по порядку.
В то время как event - событие, факт, один модуль кидает ивент и ему нет никакого дела кто будет его обрабатывать и кому этот ивент интересен.
Обработчики ивентов не знают друг о друге и никак на другие обработчики не полагаются, и ни один обработчикик не может остановить дальнейшую обработку события. (Поэтому ивенты в js с их stopPropagation(), или "events" в некоторых фреймворках не совсем ивенты).
Это уже детали реализации, в обоих случаях можно сделать прерывание работы следующих обработчиков, как и управление порядком вызова через приоритезацию. Делаем внутри Event Bus управляемую очередь вызовов обработчиков с возможностью внешнего прерывания, добавляем приоритеты вызова при подвязке на события, и всё будет работать точно как и в Chain Of Responsibility, поэтому, не убедили. Да, получится смесь EB + CoR, т.е. второй паттерн будет реализован на базе шины событий, и тогда мы, как вы сами сказали, получаем еще меньшую связанность.
В целом, это меня надвинуло на мысль, что это разрушает сам смысл сказанного выше. В том и разница, что Event Bus не позволяет исходно делать прерывания. Если мы добавим приоритеты и прерывание, это будет уже не чистый Event Bus, а как-раз помесь этих паттернов.
Получается, не надо путать результат дополнения к реализации к паттерну с самим исходным паттерном. И выходит, что оба паттерна отличаются в корне.