Инфраструктура для отслеживания пользовательских событий с использованием Typescript с шаблонами Observer, Subscriber и Singleton.

Написание сложных проектов может потребовать обработки различных событий между компонентами. Некоторые из этих компонентов могут быть слишком далеки друг от друга в плане программирования. Создание глобальной системы событий для обработки этого может решить проблему.

Шаблон системы событий

Система событий должна содержать следующие методы:

  • subscribe(event, handler). Этот метод используется для подписки сущностей на получение событий и запуска обработчиков этих событий. Он будет использоваться сущностью, заинтересованной в некоторых событиях.
  • unsubscribe(event, handler). Этот метод используется для отмены подписки сущностей на получение событий. Он будет использоваться сущностью, заинтересованной в некоторых событиях.
  • notify(event, ...args). Этот метод используется для уведомления всех сущностей, которые подписаны на событие, о событии, которое было запущено. Он будет использоваться сущностью, отправляющей события другим.

Что такое синглтон

Синглтон — это шаблон программирования, который гарантирует наличие в памяти только одного экземпляра класса. Это полезно для классов, которые управляют ресурсами, которые должны использоваться только для одного экземпляра за раз.

Шаблон Singleton реализуется путем создания закрытого конструктора для класса, который не позволяет другим частям кода создавать его экземпляры. Единственный способ получить экземпляр класса — использовать статический метод, который возвращает один существующий экземпляр.

Система событий Singleton

Система событий будет использовать шаблон Singleton, чтобы избежать утечек памяти и убедиться, что во всем коде есть только один экземпляр системы событий, чтобы обеспечить логическую согласованность. Это заставит класс системы событий вести себя одинаково глобально в коде и позволит получить доступ к логике системы событий через getInstance статический метод.

События

Система событий сможет запускать события и уведомлять о них подписчиков. Этот процесс должен быть максимально типизирован. Впервые события могут храниться в интерфейсе с их именами, аргументами обработчика и типами возвращаемого значения обработчика. Позже мы расширим это с помощью дженериков TypeScript, чтобы можно было использовать ваши собственные типы, что сделает систему событий более настраиваемой.

Подписчики событий

Подписчики будут уведомлены о происходящих событиях. У каждого подписчика будет событие, о котором он будет уведомлен, и обработчик, который будет использоваться для обработки события.

Функции не являются примитивами в мире JavaScript (более того, они являются объектами) и хранятся в программе как указатели. Таким образом, функции могут быть уникальными, даже если они имеют один и тот же код внутри. Это позволяет проницательным уникальным подписчикам использовать событие, на которое они подписаны, и обработчик события, используемый для события.

Подписчики Методы

Поскольку поле subscribers класса EventSystem является массивом, достаточно добавить или удалить элемент массива. Логика срабатывания обработчика событий будет реализована в методе notify.

Методы уведомления

Метод системы событий notify будет использоваться компонентами, которые намерены инициировать какое-либо действие. Этот метод запускает обработчики событий всех подписчиков.

Применение

Итак, после реализации всей этой логики Event System готова к работе. В настоящее время нет возможности продлевать события, поэтому они должны быть предопределены. Такое расширение и некоторые другие возможности будут реализованы во второй части.

Github Repository: https://github.com/NickSettler/events-system