суть в том, что Вы можете не писать код сплошняком в одном и том же классе, если система модульная и код нужно использовать из разных модулей.
К примеру, есть 2 модуля, и нужно организовать между ними автоматическое взаимодействие, когда происходит какое либо событие в одном из модулей. Например в модуле 1 мы создали сущность, и по задаче у нас в модуле 2 должна создаться какая то сущность.
И вот чтобы не использовать классы из модуля №1 в модуле №2 и наоборот, можно выбрасывать событие - например entityCreated - это событие(идентификатор, и возможно параметры) выбрасывает модуль 1, а модуль 2 должен быть подписан на это событие (это уж у кого как реализовано). Я делал так - в БД таблица handlers, там связки ИД события => обработчик.
Как запускать обработчики событий - тоже по разному можно сделать)